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 }

 

posted @ 2019-06-22 19:03  Royzzzzz  阅读(217)  评论(0编辑  收藏  举报