快速排序的基本思想是分治法,即按照範圍內的第乙個元素劃分為兩個部分,再歸併排序。
整體排序的過程有點類似建立平衡二叉樹的過程。
1、假設陣列長度為len,low = 0,high = len-1。以陣列low為標準,根據和首元素的大小關係將待排序陣列分為兩個部分,返回分組index。
2、陣列被劃分為兩部分0到index和index+1到high。
3、重複第1、2步,直到low >= high為止。
時間複雜度是o(nlog2n),空間複雜度是o(n)
快速排序每次將待排序陣列分為兩個部分,在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。
而在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o(nlogn),最壞情況為o(n^2)。在實際應用中,快速排序的平均時間複雜度為o(nlogn)。
不穩定,在排序的過程中很有可能打亂資料的先後順序。
以資料21,39,18,10,40,3,15,51為例
第一次排序,以21作為標準,將陣列劃分為兩部分。劃分過程中,陣列元素變化如下所示。
15 39 18 10 40 3 15 51
15 39 18 10 40 3 39 51
15 3 18 10 40 3 39 51
15 3 18 10 40 40 39 51
15 3 18 10 40 40 39 51
15 3 18 10 40 40 39 51
15 3 18 10 21 40 39 51
以後針對每個劃分的部分進行排序,直到low大於等於high就表示排序結束了。
private static int actualsort(int array, int low, int high)
array[low] = array[high];
while (low < high && array[low] <= temp)
array[high] = array[low];
} array[low] = temp;
return low;
}
public class sort
array[low] = array[high];
while (low < high && array[low] <= temp)
array[high] = array[low];
} array[low] = temp;
return low;
} private static void quicksort(int array, int low, int high)
int index = actualsort(array, low, high);
quicksort(array, low, index);
quicksort(array, index+1, high);
} private static void printf(int array)
system.out.println();
} public static void main(string args) ;
quicksort(array, 0, array.length-1);
printf(array);
}}
colletions.sort()以及arrays.sort()針對基本資料型別排序,底層實現是快速排序。
排序演算法 經典排序演算法之氣泡排序
氣泡排序很經典了,有人比喻過像是排序演算法中的hello world,很貼切。演算法的基本思想是每次都需要兩兩比較大小。氣泡排序演算法的過程如下 從前往後 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應...
排序演算法 經典排序演算法之選擇排序
演算法的基本思想,是從無序中選擇最小的元素,然後交換。1 從陣列的第乙個元素開始,將待排序陣列分為有序和無序兩個區間。2 從無序陣列中選取最小的元素和有序陣列的最後乙個元素交換。3 重複第2步,直到無序陣列沒有元素為止。時間複雜度為o n n 空間複雜度為o 1 選擇排序是給每個位置選擇當前元素最小...
排序演算法 經典的排序演算法總結
一 氣泡排序 1.氣泡排序的思想 對於乙個長度為n的陣列,從小到大進行排序。0 n 1範圍內,兩兩進行比較與交換,結果是最大的元素放在陣列的最後面 即n 1位上 0 n 2範圍內,兩兩進行比較與交換,結果是第二大元素放在最後面 即n 2位上 重複上述過程,直到範圍縮小到只有0位的乙個元素為止。2.例...