排序算法(四)冒泡排序及其优化

来源:互联网 发布:h5房卡麻将源码 编辑:程序博客网 时间:2024/05/16 17:39

基本思路:
冒泡排序的基本思路是通过元素的两两比较不断将较大值(升序)或则较小值(降序)移动序列的后面,类似于气泡向上冒的排序算法。

​ 1、比较相邻两个元素大小,如若不符合要求则交换元素;
​ 2、对整个序列做同样1的操作,最后的元素一定是当前比较的序列中最大(或最小)的元素;
​ 3、重复以上操作除了上一次遍历的最后一个元素。
图解(升序):
这里写图片描述

我们可以根据冒泡排序原理写出代码:void BubbleSort(int arr[], int len)//升序{    int i = 0;    int j = 0;    for (i = 0; i < len; i++)    {        for (j =i+1; j <len ; j++)        {            if (arr[i] > arr[j])            {                swap(arr[i], arr[j]);            }        }    }

但是,如图所示,第七趟排完已经是有序,但是上面的代码,还会多走几趟,为了提高效率,我们可以优化以上代码,用一个标志位来标识某一趟是否有交换数据,如果某一趟没有一个数据进行交换,做说明已经有序,可以直接停止。

如下给出优化后的代码:

void BubbleSort(int arr[], int len)//升序{    int i = 0;    int j = 0;    int flag = 1;//    for (i = 0; i < len && flag; i++)    {        flag = 0;  //假设有序,经过一趟比较后若有序,则flag值不变,下趟可直接结束循环        for (j = i + 1; j <len; j++)        {            if (arr[i] > arr[j])            {                flag = 1;   //若发生交换,则改变flag的值                swap(arr[i], arr[j]);            }        }    }}

测试代码如下:

int main(){    int arr[] = { 0,9,1,4,7,5,3,6,2,8 };    int len = sizeof(arr) / sizeof(arr[0]);    BubbleSort(arr, len);    for (int i = 0; i < len; i++)    {        cout << arr[i] << "  ";    }    cout << endl;    system("pause");    return 0;}