排序算法學習內容來源于《啊哈算法》,如果我的行為侵犯了作者的權益,麻煩告知一下,我立刻給刪除
關鍵詞:交換,跳躍,分治
交換:同冒泡排序一樣,都是基于交換的一種排序方式。
跳躍:相比冒泡排序相鄰的數之間的交換,快速排序的交換是跳躍式的,交換的距離比冒泡排序要大
分治:采用分治的思想。將整體分而治之。
快速排序之所以比較快,是因為相比冒泡排序,每次交換是跳躍式的。每次排序的時候設置一個基準點,將小于等于基準點的數全部放到基準點的左邊,將大于等于基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像冒泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大得多了。因此總的比較和交換次數就少了,速度自然就提高了。當然在最壞的情況下,仍可能是相鄰的兩個數進行了交換。因此快速排序的最差時間復雜度和冒泡排序是一樣的,都是 O(N2),它的平均時間復雜度為 O (NlogN)。其實快速排序是基于一種叫做“二分”的思想。
private void quickSort(int[] pInts, int pLeft, int pRight) {
int i, j, temp;
if (pLeft >= pRight) {
return;
}
i = pLeft;
j = pRight;
// 記錄基準數
temp = pInts[pLeft];
// 如果i!=j,表示兩個探針還沒有相遇,還沒有找到基準數將要歸位的位置索引
while (i != j) {
// 向左探查,直到找到小于基準值的數后才停止
while (pInts[j] >= temp && i < j) {
j--;
}
// 向右探查,直到找到大于基準值的數后才停止
while (pInts[i] <= temp && i < j) {
i++;
}
// 交換兩個位置的數值
if (i < j) {
swap(pInts, i, j);
}
}
// 如果執行到這里,就表示兩個探針已經相遇,且找到基準書將要歸位的位置索引
// 將當前位置的數值和基準值交換
pInts[pLeft]=pInts[i];
pInts[i]=temp;
quickSort(pInts, pLeft, i - 1);
quickSort(pInts, i + 1, pRight);
}
private void swap(int[] pArr, int a, int b) {
pArr[a] = pArr[a] + pArr[b];
pArr[b] = pArr[a] - pArr[b];
pArr[a] = pArr[a] - pArr[b];
}