数据结构:冒泡排序(C++实现)

it2022-05-08  8

一、冒泡排序定义:

       两两比较相邻记录的关键字,如果反序则交换,直到没有反序的纪录为止。

二、冒泡排序原理

比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

三、排序过程

如需要排序的元素为 {9,1,5,8,3,7,4,6,2}将需要排序的元素按照从小到大依次排序。 排序过程:

排序前:  {9,1,5,8,3,7,4,6,2}经过第一轮排序 {1,9,2,5,8,3,7,4,6}经过第二轮排序 {1,2,9,3,5,8,4,7,6}经过第三轮排序 {1,2,3,9,4,5,8,6,7}   经过第四轮排序 {1,2,3,4,9,5,6,8,7}经过第五轮排序 {1,2,3,4,5,9,6,7,8}经过第六轮排序 {1,2,3,4,5,6,9,7,8}经过第七轮排序{1,2,3,4,5,6,7,9,8}经过第八轮排序{1,2,3,4,5,6,7,8,9}

以上就是冒泡排序的整个排序过程,经过八轮排序之后所有排序已经完成。

四、代码

/*不带标记位的冒泡排序算法*/ #include<iostream> using namespace std; const int MAX_SIZE = 9; int Bubble_Sort(int Arr[]); int main() { int Arr[MAX_SIZE] = {9,1,5,8,3,7,4,6,2}; // 待排序元素 Bubble_Sort(Arr); //排序 return 0; } int Bubble_Sort(int Arr[]) { int n = MAX_SIZE - 1; // 排序总轮数 for (int i = 0; i <=n; i++) { for (int j = n-1; j >=i; j--) { if (Arr[j] > Arr[j + 1]) { int tmp = Arr[j + 1]; Arr[j + 1] = Arr[j]; Arr[j] = tmp; } } //每一轮排序后输出元素顺序 for (int i = 0; i < MAX_SIZE; i++) { cout << Arr[i] << " "; } cout << endl; } return 0; }

程序执行结果:

分析:当程序执行到就八次时已经有序,第几次为无效。这样我们可以改进一下排序算法,设置一个元素位置交换标志位记录本次排序是否有元素位置发生变化,如果没有则认为排序已经完成,程序不需要再继续执行,改进后的程序如下。

/*改进后带标记位的冒泡排序算法*/ #include<iostream> using namespace std; const int MAX_SIZE = 9; int Bubble_Sort_r(int Arr[]); int main() { int Arr2[MAX_SIZE] = {9,1,5,8,3,7,4,6,2}; // 待排序元素 Bubble_Sort_r(Arr2); // 排序 return 0; } int Bubble_Sort_r( int Arr[]) { bool SwapFlag = true; // 标志位,记录每次排序是否有元素位置交换 int n = MAX_SIZE - 1; for (int i = 0; i < n&&SwapFlag!=false; i++) // 如果上次排序元素位置未改变,则排序完成。 { SwapFlag = false; // 每次排序前,标志位复位 for (int j = n-1; j >=i; j--) { if (Arr[j] > Arr[j + 1]) { SwapFlag = true; //发生位置交换,标志位置位 int tmp = Arr[j + 1]; Arr[j + 1] = Arr[j]; Arr[j] = tmp; } } for (int i = 0; i < MAX_SIZE; i++) { cout << Arr[i] << " "; } cout << endl; } return 0; }

程序执行结果:

 


最新回复(0)