日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java快排原理_Java数据结构与算法——快速排序

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据结构与算法——快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。