java快排原理_Java数据结构与算法——快速排序
聲明:碼字不易,轉載請注明出處,歡迎文章下方討論交流。
前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本篇文章介紹排序算法中最常用也是面試中最容易考到的排序算法——快排,包括快排的思想和原理、java快排代碼、快排的特點性能和快排的適用場景。
0、其他排序算法索引(待更)
1、快速排序思想及原理
事實上,快速排序是堆冒泡排序的一種改進。
它的基本思想是:通過一趟排序將要排序的數據分割為兩部分,第一部分所有數據比第二部分的所有數據小,按照這種思路將兩部分數據再次分別進行快速排序,可以使用遞歸完成,最終使得整個數據序列有序。
具體來講,在待排數據中找一個基準數據(通常取第一個數),接下來將待排數據中比基準數據小的放在待排數據的左側,將比待排數據中比基準數據大的放在待排數據右側。此時,左右兩個分區的元素相對有序,接著采用上述思路繼續對左右兩個分區繼續排序,直到各分區只有一個元素位置。這里用到了一個典型的分治思想。下面舉例說明:
待排序列依次為47、29、71、99、78、19、24、47。為了區分兩個47,將后面的47下面增加一個下劃線。
步驟:
1、選取一個基準數,一般選第0個元素47。
2、將比基準數小的移動到左側,比基準數大的移動到右側,相等的不移動,此時基準數位置為K。
3、對左右兩側重復步驟1和步驟2,直到左右側細分到只有一個元素。
快排的難點也就是在第2步,怎么移動各個數據?
<1> 首先從數列的右邊開始往左找,設下標為i,也就是i--操作,找到第一個比基準數小的值,讓他與基準數交換;
<2> 接著開始從左往右找,設下標為j,也就是j++,找到第一個比基準數大的值,讓他與基準數交換位置;
<3> 重復1和2,直到i和j相遇時結束,最后基準值所在位置為k。
2、java快排代碼
public class QuickSort {
private int[] array;
public QuickSort(int[] array){
this.array = array;
}
public void printSort(){
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
public void sort(){
quicksort(array,0,array.length -1);
}
private void quicksort(int[] array,int begin,int end){
if(begin
int base = array[begin]; //取第一個值為基準值
int i = begin; //左標記為i
int j = end; //右標記為j
//一趟排序,找到比基準值大的在基準值右,比基準值小的在基準值左
while(i
//從右往左掃描
while(ibase){ //從右往左掃,如果元素比基準值大
j--; //則右邊標記--,直到找到第一個比基準值小的,停止掃描
}
if(i
array[i]=array[j]; //交換右掃描第一個比基準值小的數
i++; //i標記右移一位
}
//從左往右掃描
while(i
i++; //則左標記++,直到找到第一個比基準值大的,停止掃描
}
if(i
array[j]=array[i]; //交換左掃描第一個比基準值大的數
j--; //j標記左移一位
}
} //此時基準值左右兩側相對有序
array[i] = base; //此時i為中間位置k
quicksort(array,begin,i-1); //左側按照快排思路,遞歸
quicksort(array,i+1,end); //右側按照快排思路,遞歸
}
}
}
測試代碼
public class SortTest {
public static void main(String[] args) {
teseQuickSort();
}
private static void teseQuickSort(){
int[] array = {3,5,7,3,8,9,6,1,0};
QuickSort qs = new QuickSort(array);
qs.sort();
qs.printSort();
}
}
3、快排的特點及性能
快排是在冒泡排序之上改進而來的,冒泡排序每次只能交換相鄰的兩個元素,而快排則是跳躍式的交換,交換距離很大,總的比較次數和交換次數少了很多,速度也快了很多。
快排的平均時間復雜度為O(nlogn),事實上,大多數情況下,排序速度要快于這個時間復雜度。快排實際上是采用的一種分而治之的思想,把問題分解為一個個的小問題去逐一解決,最終在把結果組合起來。
快排因為遞歸調用,所以空間復雜度為O(logn)。
快排是一種不穩定的排序算法,在經過排序后,等值的元素的相對位置可能發生改變。
快排基本上被認為是相同數量級中所有排序算法中平均性能最好的。
4、快排的適用場景
快排由于相對簡單而且性能不錯,所以快排適用于幾乎絕大多數場合。
碼字不易,如對您有幫助,歡迎點贊收藏打賞^_^
總結
以上是生活随笔為你收集整理的java快排原理_Java数据结构与算法——快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页制作怎么音乐(网页制作怎么加入音乐)
- 下一篇: 微信开发怎么做的(微信开发怎么做的好)