冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:俩俩比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
最简单排序实现
原理
让每一个关键字,都和它后面的每一个关键字比较,如果大则交换,直到结束。如图:
算法
#include "stdafx.h" using namespace std; #include<iostream> #include"stdafx.h" //用于要排序数组个数最大值,可根据需要修改 #define MAXSIZE 10 typedef struct { //用于存储要排序数组,r[0]用作哨兵或临时变量 int r[MAXSIZE + 1]; //用于记录顺序表的长度 int length; }SqList; //交换L中数组r的下标为i和j的值 void swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } //对顺序表L作交换排序(冒泡排序初级版) void BubbleSort0(SqList *L) { int i, j; for (i = 1; i<L->length; i++) { for (j = i + 1; j <= L->length; j++) { if (L->r[i]>L->r[j]) { //交换L->r[i]与L->r[j]的值 swap(L, i, j); } } } } #define N 9 int main() { int d[N] = { 9,1,5,8,3,7,4,6,2 }; SqList L0; for (int i = 0; i < N; i++) { L0.r[i + 1] = d[i]; } L0.length = N; cout<< "排序前:"; for (int j = 1; j <= L0.length; j++) { cout<< L0.r[j]; } BubbleSort0(&L0); cout << "\n初级冒泡排序:"; for (int j = 1; j <= L0.length; j++) { cout << L0.r[j]; } cout << endl; return 0; }
运行结果
冒泡排序算法
原理
俩俩比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。如图:
算法
#include "stdafx.h" using namespace std; #include<iostream> #include"stdafx.h" //用于要排序数组个数最大值,可根据需要修改 #define MAXSIZE 10 typedef struct { //用于存储要排序数组,r[0]用作哨兵或临时变量 int r[MAXSIZE + 1]; //用于记录顺序表的长度 int length; }SqList; //交换L中数组r的下标为i和j的值 void swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } //对顺序表L作交换排序(冒泡排序版) void BubbleSort(SqList *L) { int i, j; for (i = 1; i<L->length; i++) { //注意j是从后往前循环 for (j = L->length-1 ; j >=i; j--) { //若前者大于后者 if (L->r[j]>L->r[j+1]) { //交换L->r[j]与L->r[j+1]的值 swap(L, j, j+1); } } } } #define N 9 int main() { int d[N] = { 9,1,5,8,3,7,4,6,2 }; SqList L0; for (int i = 0; i < N; i++) { L0.r[i + 1] = d[i]; } L0.length = N; cout<< "排序前:"; for (int j = 1; j <= L0.length; j++) { cout<< L0.r[j]; } BubbleSort(&L0); cout << "\n冒泡排序后:"; for (int j = 1; j <= L0.length; j++) { cout << L0.r[j]; } cout << endl; return 0; }
运行结果
冒泡排序优化
原理
增加一个标记变量flag来实现冒泡算法的改进。可以避免因已经有序的情况下的无意义循环判断。
算法
#include "stdafx.h" using namespace std; #include<iostream> #include"stdafx.h" //用于要排序数组个数最大值,可根据需要修改 #define MAXSIZE 10 typedef struct { //用于存储要排序数组,r[0]用作哨兵或临时变量 int r[MAXSIZE + 1]; //用于记录顺序表的长度 int length; }SqList; //交换L中数组r的下标为i和j的值 void swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } //对顺序表L作交换排序(优化的冒泡排序版) void BubbleSort(SqList *L) { int i, j; //flag用来作为标记 bool flag = true; //若flag为true则退出退出循环 for (i = 1; i<L->length&&flag; i++) { //初始为false flag = false; //注意j是从后往前循环 for (j = L->length-1 ; j >=i; j--) { //若前者大于后者 if (L->r[j]>L->r[j+1]) { //交换L->r[j]与L->r[j+1]的值 swap(L, j, j+1); //如果有数据交换,则flag为true flag = true; } } } } #define N 9 int main() { int d[N] = { 9,1,5,8,3,7,4,6,2 }; SqList L0; for (int i = 0; i < N; i++) { L0.r[i + 1] = d[i]; } L0.length = N; cout<< "排序前:"; for (int j = 1; j <= L0.length; j++) { cout<< L0.r[j]; } BubbleSort(&L0); cout << "\n优化后的冒泡排序后:"; for (int j = 1; j <= L0.length; j++) { cout << L0.r[j]; } cout << endl; return 0; }
运行结果
冒泡排序复杂度分析
冒泡排序时间复杂度为O(n^2)
算法稳定性
稳定