你要的排序演算法
排序分多種,插入排序類有直接插入排序,希爾排序;選擇排序類有簡單選擇排序,堆排序;交換排序類有氣泡排序,快速排序。
1.氣泡排序:每輪兩兩交換排出一個最大或最小值
實現思路:
1.對相鄰的數兩兩比較其大小,前面大於後面的數,就將這兩個資料進行交換。一次往後進行比較,一輪結束將最大值放在末尾。
2.對剩下的數繼續按照該方法比較,直到所有數排完。
動態演示圖:(說再多不如一張動圖講得清楚)

實現程式碼:
/** * 氣泡排序 */ public static void bubbleSort(int[] array) { //定義排序的次數,每次找出最大的一個,總共要找array.length次 //當前排好序的個數為i for (int i = 0; i < array.length; i++) { //將剩餘的未排序的array.length-i個數迴圈進行排序,比較次數為(array.length-i-1) for (int j = 0; j < array.length - i - 1; j++) { //如果左邊的書比右邊的大,相互交換值 if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
2.插入排序:從第二個數起,將每個插入到前面有序陣列中
實現思路:
1.將前兩個數進行比較大小排序。
2.將第三個數與之前的有序陣列進行比較,一次與前一個數比較大小,直到插入到合適的位置,後面的數依次往後移一位。
3.不斷重複上述過程,直到把最後一個數插完。
動態演示圖:

程式碼實現:
/** * 插入排序 */ public static void insertSort(int arr[]) { for (int i = 1; i < arr.length; i++) {//除了第一個,後面都要插入排一次 if (arr[i] < arr[i - 1]) {//如果後一個比前一個小,需要挪動位置,否則不挪 int temp = arr[i];//temp為當前待插入元素 int j; //判斷應該插入到哪個位置 for (j = i - 1; j > 0 && temp < arr[j]; j--) {//迴圈判斷大小,看是否該往後挪動 arr[j + 1] = arr[j];//需要換位置的數往後移 } arr[j + 1] = temp;//把當前數插入最終挪出來的空位 } } }
3.選擇排序:每次選其中最小的與第i個位置交換
實現思路:
1.從該陣列中兩兩比較一輪,選出一個最小數與第一個位置交換。
2.然後從剩下的leng-1個數中選出最小的數,該輪選完就與第二個位置數交換。
3.重複上述步驟,直到最後兩個數交換完成。
動態演示圖

程式碼實現:
/** * 選擇排序 */ public static void selectSort(int[] array) { //i表示當前選擇到的位置 for (int i = 0; i < array.length; i++) { int minPos = i;//假設當前一輪選擇,最小的數為第一個,即位置i for (int j = i + 1; j < array.length; j++) { if (array[j] < array[minPos]) {//迴圈判斷與當前最小數進行比較,如有更小的則重新記錄最小值位置 minPos = j; } } //將最小數與當前輪第一個數交換 int temp = array[i]; array[i] = array[minPos]; array[minPos] = temp; } }
4.快速排序:每一輪找到中間值,對左右兩邊子列表遞迴呼叫該快速排序。
實現思路:
1.選擇一個基準元素,通常選擇第一個元素。
2.通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值都小,另一部分記錄的元素值比基準值都大。
3.此時基準元素在其排好序後的正確位置
4.然後分別對這兩部分記錄用同樣的方法繼續進行排序,每一輪遞迴呼叫排序方法,直到整個序列有序。
動態演示圖:

public static int getMiddle(int[] array, int low, int high) { int base = array[low];//取第一位置數為基準數,空出第一個位置 while (low < high) { while (low < high && base <= array[high]) {//從高位找,只要高位比基準數大,就向低位移動繼續找 high--; } array[low] = array[high];//終於,在高位找到了比基準數小的數,將其放入低位置 while (low < high && base >= array[low]) {//從低位找,只要低位比基準數小,就向高位移動繼續找 low++; } array[high] = array[low];//終於,在低位找到了比基準數大的數,將其放入高位置 } //一輪移完位置後,low下標位置仍為空位 array[low] = base;//將基準數放入low位置,此時左邊數都比base小,右邊數都比base大 return low; } /** * 快速排序 */ public static void quickSort(int[] array, int low, int high) { if (low < high) { int middle = getMiddle(array, low, high); quickSort(array, 0, middle - 1);//對左部分位置繼續呼叫排序方法 quickSort(array, middle + 1, high);//對右部分位置繼續呼叫排序方法 } }
所有程式碼如下:
public class Sort { /** * 氣泡排序:每輪兩兩交換排出一個最大或最小值 * * @param array */ public static void bubbleSort(int[] array) { //定義排序的次數,每次找出最大的一個,總共要找array.length次 //當前排好序的個數為i for (int i = 0; i < array.length; i++) { //將剩餘的未排序的array.length-i個數迴圈進行排序,比較次數為(array.length-i-1) for (int j = 0; j < array.length - i - 1; j++) { //如果左邊的書比右邊的大,相互交換值 if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } /** * 插入排序:從第二個數起,將每個插入到前面有序陣列中 * * @param arr */ public static void insertSort(int arr[]) { for (int i = 1; i < arr.length; i++) {//除了第一個,後面都要插入排一次 if (arr[i] < arr[i - 1]) {//如果後一個比前一個小,需要挪動位置,否則不挪 int temp = arr[i];//temp為當前待插入元素 int j; //判斷應該插入到哪個位置 for (j = i - 1; j > 0 && temp < arr[j]; j--) {//迴圈判斷大小,看是否該往後挪動 arr[j + 1] = arr[j];//需要換位置的數往後移 } arr[j + 1] = temp;//把當前數插入最終挪出來的空位 } } } /** * 選擇排序:每次選其中最小的與第i個位置交換 * * @param array */ public static void selectSort(int[] array) { //i表示當前選擇到的位置 for (int i = 0; i < array.length; i++) { int minPos = i;//假設當前一輪選擇,最小的數為第一個,即位置i for (int j = i + 1; j < array.length; j++) { if (array[j] < array[minPos]) {//迴圈判斷與當前最小數進行比較,如有更小的則重新記錄最小值位置 minPos = j; } } //將最小數與當前輪第一個數交換 int temp = array[i]; array[i] = array[minPos]; array[minPos] = temp; } } public static int getMiddle(int[] array, int low, int high) { int base = array[low];//取第一位置數為基準數,空出第一個位置 while (low < high) { while (low < high && base <= array[high]) {//從高位找,只要高位比基準數大,就向低位移動繼續找 high--; } array[low] = array[high];//終於,在高位找到了比基準數小的數,將其放入低位置 while (low < high && base >= array[low]) {//從低位找,只要低位比基準數小,就向高位移動繼續找 low++; } array[high] = array[low];//終於,在低位找到了比基準數大的數,將其放入高位置 } //一輪移完位置後,low下標位置仍為空位 array[low] = base;//將基準數放入low位置,此時左邊數都比base小,右邊數都比base大 return low; } /** * 快速排序,每一輪找到中間值,對左右兩邊子列表遞迴呼叫該快速排序 * * @param array * @param low * @param high */ public static void quickSort(int[] array, int low, int high) { if (low < high) { int middle = getMiddle(array, low, high); quickSort(array, 0, middle - 1);//對左部分位置繼續呼叫排序方法 quickSort(array, middle + 1, high);//對右部分位置繼續呼叫排序方法 } } private static void printArray(int array[]) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } } public static void main(String[] args) { int[] array = new int[10]; for (int i = 0; i < array.length; i++) { array[i] = (int) (Math.random() * 100 - 20); } //以下排序任選其一 bubbleSort(array); insertSort(array); selectSort(array); quickSort(array, 0, array.length - 1); printArray(array); } }
先寫到這兒,接下來會相繼加入希爾排序,堆排序等。