快速排序是實踐中已知最快的排序演算法。
基本思想:選取乙個樞紐元進行一趟快排,將比起小的元素放在左邊,比其大的元素放在右邊,然後遞迴的對左右兩部分分別進行快速排序即可。
特點:
注意幾點:1.如何選取樞紐元來避免最壞情景?很多非標準例程選擇第乙個元素作為樞紐,如果輸入是隨機的,那這樣是可以接受的,但是如果輸入是預排序或者反序的,那這樣就會產生乙個劣質的分割,因為所有元素都被分配到一部分中去了,感覺什麼都沒有幹,這樣就退化為冒泡演算法了,時間複雜度是o(n^2)。2.如何進行資料分割,就是根據樞紐元進行一趟快排?
3.小陣列的時候使用快排合適嗎?
這裡介紹三分中值演算法。我們知道一組n個數的中值第[n/2]個大的數,樞紐元的最好選擇就是中值。不幸的是中值不好算,怎麼辦呢?
一般採用左端、中間和右端三個元素的中值作為樞紐元,這樣就消除了預排序輸入的壞情況,提高了大約5%的執行時間。---資料**《資料結構與演算法分析_c語言描述》
本文介紹一種比較實際應用比較好的分割策略。該法的第一步是通過將樞紐元與最後的元素交換使得樞紐元離開要分割的資料段。然後設定2個指標i、j左移和右移完成一趟快排。
下圖是交換過程:
對於很小的陣列,快速排序反而不如插入排序,不僅如此,因為快速排序是遞迴的,這種情況經常發生。通常的解決方法是對小的陣列不遞迴的使用快速排序,而是使用插入排序。一般n<=10是乙個比較好的截止範圍。
void quicksort(int arr)
private static final int cutoff = 10;
//遞迴版本
void quicksortrec(int arr,int left,int right)else
}//非遞迴版本
void quicksortnorec(int arr,int left,int right)
if(i>>1);
if(arr[left]>arr[mid])
if(arr[left]>arr[right])
if(arr[mid]>arr[right])
swap(arr,mid,right-1); //hide the privote
return arr[right-1];//return the privote
}
排序總結 快速排序
思想 從陣列中選取乙個數作為基準值,按照從大到小排序小於基準值的放在基準值的左邊,大於基準值的在基準值的右邊 核心partition過程 選取陣列第乙個元素作為基準值,小於區 left 1,j 1 大於等於區 j,i 1 讓變數i從left 1位置開始遍歷陣列,j變數位置是小於區間的而最後乙個數,若...
經典排序演算法6 快速排序
快速排序對給定陣列中的元素 進行重新排列,以得到乙個快速排序的分割槽,在一 個分割槽中,所有在s下標之前的元素都小於等於a s 所有在s下標之後的元素都大於等於a s 即a s 已經位於它在有序陣列中的最終 位置。1.首先選擇乙個元素為中軸,一般選擇為第乙個元素,a l 2.建立分割槽 分別掃瞄與中...
排序演算法總結(快速排序)
終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...