1.起泡排序
1.1.初始版本
1 void bubble_sort_1(int *arr,int length) {
2 int i, j;
3 for (i = 0; i < length; i++) {
4 for (j = 0; j < length-i-1; j++) {
5 if (arr[j] > arr[j + 1])
6 std::swap(arr[j], arr[j + 1]);
7 }
8 }
9 }
1.2.改进1:如果在进行循环到了某一步的时候,发现总体已经有序了,则直接结束循环。
1 void bubble_sort_2(int a[], int n) {
2 for (bool sorted = false; sorted = !sorted; n--) {
3 for (int i = 1; i != n; i++) {
4 if(a[i - 1]> a[i]){
5 std::swap(a[i - 1], a[i]);
6 sorted = false;
7 }
8 }
9 }
10 }
1.3.改进2:记录每次最右边的逆序点(该点后半部分已经有序),则可以从该点往左边进行再排序,省去了已经有序再排序的部分步骤。
1 void bubble_sort_3(int a[], int n) {
2 int last = 0;
3 int a_border = n;
4 for (bool sorted = false; sorted = !sorted; a_border--) {
5 for (int i = 1; i != a_border; i++) {
6 if (a[i - 1] > a[i]) {
7 std::swap(a[i - 1], a[i]);
8 sorted = false;
9 last = i;
10 }
11 }
12 a_border = last;
13 }
14 }
1.4.一种优美的写法,这里不写注释,常看常新,每每看之,皆是启发和感慨。
1 void bubleSort(int lo, int hi) {
2 while (!buble(lo, hi--));
3 }
4 bool bubble(int lo, int hi) {
5 bool sorted = true;
6 while (++lo<hi)
7 if (elem[lo - 1] > elem[lo]) {
8 sorted = false;
9 swap(elem[lo - 1], elem[lo]);
10 }
11 return sorted;
12 }