快速排序
快速排序是一種改進版的冒泡排序。針對一組數據,按從小到大排序爲例。首先隨機選取一個數爲基準(一般選取第一個數或者中間數)然後將數據分成左右兩組,左邊的每個數據都比基準小,右邊的每個數據都比基準大。其實現思路是:
- 首先確定基準,然後確定左指針和右指針;
- 右指針先往左移動,找出比基準小的數的下標;
- 當右指針找到比基準小的數時,左指針開始向右移動,找到比基準打的數的下標;
- 如果左指針和右指針沒有重合,就將各自找到的數進行交換位置;
- 重複2-4步,直到左右指針重合,一趟排序結束;
- 從指針位置分別進行左遞歸和右遞歸操作,直至排序完成。
快速排序的平均時間複雜度爲O(nlogn),最差時間複雜度爲O(n^2)。
我分別試了一下以第一個數、中間數和最後一個數爲基準的方式,如有錯誤,還望指出,我會及時改正。代碼如下:
package com.sort.quickSort;
import java.util.Arrays;
public class QuickSortDemo2 {
public static void main(String[] args) {
int[] array = new int[10];
// 隨機生成10個0~100至今的數
int count = 0;// 記錄有效的隨機數個數
boolean flag = true;// 用來標誌的變量
int num = 0;
while (count < array.length) {
num = (int) (Math.random() * 100);
for (int i = 0; i < array.length; i++) {
if (num == array[i]) {
flag = false;
break;
}
}
if (flag) {
array[count] = num;
count++;
} else {
flag = true;
}
}
System.out.println("排序前的數組:" + Arrays.toString(array));
quickSort(array, 0, array.length - 1);
}
// 快速排序
static int count = 0;
public static void quickSort(int[] array, int begin, int end) {
if (begin > end) {
return;
}
// 1.將頭尾暫存
int left = begin;
int right = end;
// 2.選擇基準
int temp = array[begin];// 以第一個數爲基準
// int temp=array[(begin+end)/2];//以中間數爲基準
// int temp=array[end];//以最後一個數爲基準
while (left != right) {
// 先讓右指針往前移,每次要保證right>left
// array[right]>temp:每次往前移動的時候,要麼找到比基準小的數,要麼找到基準的位置
while (left < right && array[right] > temp) {
right--;
}
// 再讓左指針往後移,每次要保證right>left
// array[left]<temp:每次往後移動的時候,要麼找到比基準大的數,要麼找到基準的位置
while (left < right && array[left] < temp) {
left++;
}
// 只要左右指針沒有重合,就將兩個指針找到的數互換位置
// 1.如果左指針找到的數比基準大,右指針找到的數比基準小,互換位置
// 2.如果左指針找到的是基準的位置,右指針找到的數比基準小,互換位置後,基準的最終位置只會在此或其之前了;
// 3.如果左指針找到的數比基準大,右指針找到的是基準的位置,互換位置,基準的最終位置只會在此或其之後了;
// 4.左右指針一旦重合,說明都找到了移動到了基準的位置,就不用了互換位置了
if (left != right) {
int i = array[right];
array[right] = array[left];
array[left] = i;
}
}
// left和right就重合,表示一趟排序結束
System.out.println("第" + (++count) + "趟排序後:" + Arrays.toString(array));
// 分別向左和向右遞歸
quickSort(array, begin, left - 1);
quickSort(array, right + 1, end);
}
}