纯手撸——冒泡排序

思想:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

#include <stdio.h>
int main()
{
    int a[] = {9,6,5,7,8,2,1,3}; //自行修改
    int n=8;  //n为数组中元素个数,即长度
    int i;  
    int j;  
    int tmp;  //交换数据时临时存储用
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=n-1; j>i; j--) 
        {
            if (a[j] < a[j-1]) //反序
            {	
                //swap算法
                tmp = a[j-1];
                a[j-1] = a[j];
                a[j] = tmp;
            }
        }
    }
    //输出
    for (i=0; i<n; i++)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
}

比较简单,复盘一下:

void BubbleSort(int a[],int n)
{
	int i,j,tmp;
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{	
			if(a[j-1]>[j]) //反序
			{
				//swap
				tmp = a[j-1];
				a[j-1]=a[j];
				a[j]=tmp;
			}
		}
	}
}

当然,有些情况,在i(i<n-1)趟已经排好了,但仍执行后面几趟比较,没必要,这里进行改进。因为该算法一旦某一趟比较时不出现任何元素交换,则一定排序好了,结束即可。

void BubbleSort(int a[],int n)
{
	int i,j;
	bool exchange; //标志
	for(i=0;i<n-1;i++)
	{
		exchange=false; //先置为假
		for(j=n-1;j>i;j--)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j],a[j-1]); //略
				exchange=true; //一旦交换,置true
			}
		}
		if(!exchange) //本趟没有交换,中途结束算法
		{
			return;
		}
	}
}
posted @ 2020-08-11 10:37  我在吃大西瓜呢  阅读(143)  评论(0编辑  收藏  举报