#include <iostream> using namespace std; //依次比较相邻的两个数,将大数放在前面,小数放在后面。 //即首先比较第1个和第2个数,将大数放前,小数放后。 //然后比较第2个数和第3个数,将大数放前,小数放后,如此继续, //直至比较最后两个数,将大数放前,小数放后, //此时第一趟结束,在最后的数必是所有数中的最小数。重复以上过程 //小数往后放,相当于气泡往上升,所以称作冒泡排序 //若记录序列的初始状态为"正序", //则冒泡排序过程只需进行一趟排序, //在排序过程中只需进行n-1次比较,且不移动记录; //反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。 //因此冒泡排序总的时间复杂度为O(n*n)。 //冒泡排序 void bubble_sort_1(int a[], int n) { int i = 0; int j = 0; int temp = 0;//用于交换 for (i = 0; i < n - 1; i++) { //从后往前交换,这样最小值冒泡到开头部分 for(j = n; j >= i; j--) { if (a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } //冒泡排序2 void bubble_sort_2(int a[], int n) { int i = 0; int j = 0; int temp = 0; //用于记录每次扫描时是否发生交换 int exchange = 0; for (i = 0; i < n - 1; i++) { exchange = 0; //从后往前交换,这样最小值冒泡到开头部分 for(j=n - 1;j >= i;j--) { if (a[j+1] < a[j]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; exchange = 1; } } //此次扫描没有发生过交换,说明已经是排序的 //不需要进行下次扫描 if (exchange != 1) return; } } void print_array(int a[], int n) { for(int i = 0; i < n; i++) { cout << a[i] << ","; } } int main() { int a[] = {7,3,5,8,9,1,2,4,6}; cout << "before insert sort" << endl; print_array(a, 9 ); cout << "after insert sort" << endl; bubble_sort_1(a, 9 ); print_array(a, 9 ); return 0; }