1. 程式人生 > >Java實現快速排序

Java實現快速排序

static nlogn -- 可能 超過 highlight uic 數組 images

一、快速排序的思想

  基於分治的思想,是冒泡排序的改進型。首先在數組中選擇一個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),然後分別從數組的兩端掃描數組,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換lo和hi位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復循環,直到lo>=hi,然後把基準點的值放到hi這個位置。一次排序就完成了。以後采用遞歸的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該數組就自然有序了。

排序過程:

技術分享

二、下面我們來看一個具體的例子:

下面我們通過一個案例來演示一下快速排序的基本步驟: 以序列 46 30 82 90 56 17 95 15 共8個元素

    初始狀態: 46 30 82 90 56 17 95 15 選擇46 作為基準值,i = 0, j = 7

           i = 0 j = 7

       15 30 82 90 56 17 95 46 15 < 46, 交換 15 和 46,移動 i, i = 1

             i = 1 j = 7

           15 30 82 90 56 17 95 46 30 < 46, 不需要交換,移動 i , i = 2

               i = 2 j = 7

           15 30 46 90 56 17 95 82 82 > 46, 交換82 和 46,移動 j , j = 6

               i = 2 j = 6

           15 30 46 90 56 17 95 82 95 > 46, 不需要交換,移動 j , j = 5

               i = 2 j = 5

           15 30 17 90 56 46 95 82 17 < 46, 交換46 和 17,移動 i, i = 3

                 i = 3 j = 5

           15 30 17 46 56 90 95 82 90 > 46, 交換90 和 46,移動 j , j = 4

               3 = i j = 4

           15 30 17 46 56 90 95 82 56 > 46, 不需要交換,移動 j , j = 3

                i = j = 3

    

    i = j = 3, 這樣序列就這樣分割成了兩部分,左邊部分{15, 30, 17} 均小於 基準值(46);右邊部分 {56, 90,95,82},均大於基準值。這樣子我們就達到了分割序列的目標。在接著對子序列用同樣的辦法進行分割,直至子序列不超過一個元素,那麽排序結束,整個序列處於有序狀態。

三、快速排序算法的實現:

public static int getMiddle(int[] list, int low, int high){
	int tmp = list[low];//數組的第一個作為中軸
	while (low < high){
		while (low < high && list[high] >= tmp){
			high--;
		}
		list[low] = list[high];//比中軸小的記錄移到低端
		while (low < high && list[low] <= tmp){
			low++;
			}
		list[high] = list[low];//比中軸大的記錄移到高端
		}
	list[low] = tmp;//中軸記錄到尾
	return low;//返回中軸的位置
	}
public static void _quickSort(int[] list, int low, int high){
	if (low < high){
		int middle = getMiddle(list, low, high);//將list數組進行一分為二
		_quickSort(list, low, middle - 1);//對低字表進行遞歸排序
		_quickSort(list, middle + 1, high);//對高字表進行遞歸排序
	}
}

  所謂的中軸的位置就是選擇的那個基準數所在的位置。

使用的時候直接調用_quickSort方法即可,low為數組的第一個元素的下標0high為數組的最後一個元素的下標a.length-1

快速排序的時間復雜度為O(NlogN)

Java實現快速排序