冒泡排序--兩種優化方式
阿新 • • 發佈:2017-09-20
元素 下標 [0 void 臨時變量 [] cnblogs 數組下標 blog
原始版本
void bubble_sort(int arr[],int n){ int tmp; for (int i = 0; i < n; ++i) { for (int j = 0; i < n; ++j) { if (arr[j] < arr[j+1]) { tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } }
優化版本一
如果內層循環沒有進行交換,說明後面的元素已經有序,則不需要繼續循環。因此,我們可以設置一個標記來標誌一趟比較是否發生交換。如果沒有發生交換,則數組已經有序。
void bubble_sort(int arr[],int n){ int tmp; int flag ; for (int i = 0; i < n; ++i) { flag = false; for (int j = 0; i < n; ++j) { if (arr[j] < arr[j+1]) { flag = true; tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } if (!flag) break; } }
優化版本二
如果數組A[i....n]已經有序,那麽,內層循環只需要遍歷A[0....i]即可。因此,我們可以使用一個臨時變量來記錄最後一次交換的數組下標。
void bubble_sort(int arr[],int n){ int tmp; int flag ; int k = n; int s = 0; for (int i = 0; i < n; ++i) { flag = false; for (int j = 0; i < k; ++j) { if (arr[j] < arr[j+1]) { flag = true; tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; s = j;//保存最後一次交換的下標; } } if (!flag) break; k = s;//最後一次交換的位置給k,減少比較的次數; } }
冒泡排序--兩種優化方式