冒泡排序:
顧名思義:參與排序的數據就像水中的氣泡慢慢浮出水面一樣“浮”到數列頂端。
冒泡排序要點:
1、 兩層循環,外層循環控制走訪數列重復進行的次數,內層循環進行數據的比較、交換,是數據“上浮”。
2、 內層循環是相鄰的數據進行比較。

C語言代碼實現:
// 冒泡排序 void sort_bubble(int n){ int i,j; for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1]){ // 進行一次交換 exchange(j,j+1); } } } }
代碼優化:
通過對核心代碼的分析,不難發現,當給我們的數據已經是有序狀態時,外層循環仍舊會執行n-1次,內層循環因為數據已經有序,只會進行相鄰數據的比較而不進行數據的交換。這個時候我們的外層循環導致我們的程序做了很多的無用功。因此我們需要對外層循環進行優化。
我們已經知道,如果我們的數據已經是有序狀態時,程序的內層循環是只進行數據的比較而不進行數據的交換,那么我們可以在內層循環設置一個變量,用來通知外層循環數據是否已經達到有序狀態,如果已經有序,則跳出外層循環,否則,繼續執行。
優化代碼:
// 冒泡排序 void sort_bubble(int n){ int i,j; int m; for(i=0;i<n-1;i++){ m = 1; // 默認數據已經為有序狀態 for(j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1]){ // 進行一次交換 exchange(j,j+1); m = 0; // 數據進行了交換,說明數據還沒有達到完全有序狀態 } } if(m==1){ break; // 如果m=1,說明數據已經為有序狀態,跳出外層循環 } } }
快速排序:
快速排序是最常用的一種排序算法,因為速度快,效率高而得名。
快速排序采用的是分治思想。
(分治思想其實就是把一個復雜的問題分解成 與原問題性質相同且相互獨立的 若干個可以直接求解的小問題。)
快速排序思路:
在一個給定的數據中,選一個元素作為基准值(這里選擇第一個元素),然后先從后往前遍歷,找到一個比這個基准值小的元素,把這個元素放到這個基准值的左邊,然后再從前往后遍歷,找到一個比基准值大的元素,放到這個基准值的右邊,直到遍歷所有元素。
當我們遍歷一遍數據之后,以這個基准值為基點,分成兩組數據量小的數組,然后對這兩個數組繼續執行上述操作。
Java代碼:
public class QuickSort { // 快速排序 public void sort_quick(int[] arr, int first, int last) { int start = first; int end = last; int key = arr[first]; if (first >= last) return; int flag = 1; // 是否有序的標記 while (start < end) { while (start < end && arr[end] >= key) end--; if (start < end) { arr[start] = arr[end]; arr[end] = key; start++; flag = 0; } while (start < end && arr[start] <= key) start++; if (start < end) { arr[end] = arr[start]; arr[start] = key; end--; flag = 0; } } arr[end] = key; if(flag == 1){ return; } if (start > first) { sort_quick(arr, first, start - 1); } if (end < last) { sort_quick(arr, end + 1, last); } } }
