快速排序,通常排序演算法中的最佳選擇,其期望時間複雜度為o(nlogn),最壞情況為o(n^2)。而且快速排序能進行就地排序,不需要像merge sort樣,使用臨時陣列。
演算法簡介
快速排序和歸併排序(merge sort)類似,都是採用分治法(divide and conquer)。與歸併排序不同的是,快速排序不是講資料平分為兩半,而是將資料分為比參參考值小的一組合比參考值大的一組。
標準的快速排序中參考值選取為a[length - 1]。但是這樣效能不穩定。為了能取得最好的平均效率,通常採用隨機法,隨機在資料中取乙個數作為參考值。下面的**就是按這種方式實現的。
演算法:假設當前陣列的長度為(r + 1)。
1,隨機選擇乙個數a[i],swap(a[i],a[r]);
2,定義兩個指標i,j= 0;i表示當前比參考值大的一組資料的開始位置,j表示當前比參考值大的一組資料的結束位置。
3,乙個迴圈,while(j
下面的一張圖是從mit《演算法導論》上截來的,i,j意義略有不同,不過最重要的是理解演算法的思想。
package sorting;
public class data
return result;
} /**
* print the array
* @param arg array
*/public static void printarray(int arg)
system.out.println(temp);
}}
package sorting;
public class quicksort
public void quicksort(int arg,int begin, int end)
j++;
}//switch arg[i] and arg[r].
// in fact, this switch can be done in the above loop
temp = arg[r];
arg[r] = arg[i];
arg[i] = temp;
quicksort(arg,begin, i - 1);
quicksort(arg, i+ 1,end);
} }}
快速排序 QuickSort
快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...
快速排序 quicksort
快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...
快速排序 QuickSort
1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...