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

xiaoxiao2021-02-27  193

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

​ 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; }
转载请注明原文地址: https://www.6miu.com/read-13064.html

最新回复(0)