国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java數(shù)據(jù)結(jié)構(gòu)與算法——快速排序

Panda / 1189人閱讀

摘要:快排是一種不穩(wěn)定的排序算法,在經(jīng)過排序后,等值的元素的相對(duì)位置可能發(fā)生改變。

聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。

前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇文章介紹排序算法中最常用也是面試中最容易考到的排序算法——快排,包括快排的思想和原理、java快排代碼、快排的特點(diǎn)性能和快排的適用場(chǎng)景。

0、其他排序算法索引(待更)

java數(shù)據(jù)結(jié)構(gòu)與算法——桶排序
java數(shù)據(jù)結(jié)構(gòu)與算法——插入排序

1、快速排序思想及原理

事實(shí)上,快速排序是堆冒泡排序的一種改進(jìn)。

它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割為兩部分,第一部分所有數(shù)據(jù)比第二部分的所有數(shù)據(jù)小,按照這種思路將兩部分?jǐn)?shù)據(jù)再次分別進(jìn)行快速排序,可以使用遞歸完成,最終使得整個(gè)數(shù)據(jù)序列有序。

具體來講,在待排數(shù)據(jù)中找一個(gè)基準(zhǔn)數(shù)據(jù)(通常取第一個(gè)數(shù)),接下來將待排數(shù)據(jù)中比基準(zhǔn)數(shù)據(jù)小的放在待排數(shù)據(jù)的左側(cè),將比待排數(shù)據(jù)中比基準(zhǔn)數(shù)據(jù)大的放在待排數(shù)據(jù)右側(cè)。此時(shí),左右兩個(gè)分區(qū)的元素相對(duì)有序,接著采用上述思路繼續(xù)對(duì)左右兩個(gè)分區(qū)繼續(xù)排序,直到各分區(qū)只有一個(gè)元素位置。這里用到了一個(gè)典型的分治思想。下面舉例說明:

待排序列依次為47、29、71、99、78、19、24、47。為了區(qū)分兩個(gè)47,將后面的47下面增加一個(gè)下劃線。

步驟:
1、選取一個(gè)基準(zhǔn)數(shù),一般選第0個(gè)元素47。
2、將比基準(zhǔn)數(shù)小的移動(dòng)到左側(cè),比基準(zhǔn)數(shù)大的移動(dòng)到右側(cè),相等的不移動(dòng),此時(shí)基準(zhǔn)數(shù)位置為K。
3、對(duì)左右兩側(cè)重復(fù)步驟1和步驟2,直到左右側(cè)細(xì)分到只有一個(gè)元素。

快排的難點(diǎn)也就是在第2步,怎么移動(dòng)各個(gè)數(shù)據(jù)?
<1> 首先從數(shù)列的右邊開始往左找,設(shè)下標(biāo)為i,也就是i--操作,找到第一個(gè)比基準(zhǔn)數(shù)小的值,讓他與基準(zhǔn)數(shù)交換;
<2> 接著開始從左往右找,設(shè)下標(biāo)為j,也就是j++,找到第一個(gè)比基準(zhǔn)數(shù)大的值,讓他與基準(zhǔn)數(shù)交換位置;
<3> 重復(fù)1和2,直到i和j相遇時(shí)結(jié)束,最后基準(zhǔn)值所在位置為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(beginbase){ //從右往左掃,如果元素比基準(zhǔn)值大
                    j--;  //則右邊標(biāo)記--,直到找到第一個(gè)比基準(zhǔn)值小的,停止掃描
                }
                if(i

測(cè)試代碼

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、快排的特點(diǎn)及性能

快排是在冒泡排序之上改進(jìn)而來的,冒泡排序每次只能交換相鄰的兩個(gè)元素,而快排則是跳躍式的交換,交換距離很大,總的比較次數(shù)和交換次數(shù)少了很多,速度也快了很多。

快排的平均時(shí)間復(fù)雜度為O(nlogn),事實(shí)上,大多數(shù)情況下,排序速度要快于這個(gè)時(shí)間復(fù)雜度。快排實(shí)際上是采用的一種分而治之的思想,把問題分解為一個(gè)個(gè)的小問題去逐一解決,最終在把結(jié)果組合起來。

快排因?yàn)檫f歸調(diào)用,所以空間復(fù)雜度為O(logn)。

快排是一種不穩(wěn)定的排序算法,在經(jīng)過排序后,等值的元素的相對(duì)位置可能發(fā)生改變。

快排基本上被認(rèn)為是相同數(shù)量級(jí)中所有排序算法中平均性能最好的。

4、快排的適用場(chǎng)景

快排由于相對(duì)簡(jiǎn)單而且性能不錯(cuò),所以快排適用于幾乎絕大多數(shù)場(chǎng)合。

其他排序算法索引(待更)
java數(shù)據(jù)結(jié)構(gòu)與算法——桶排序
java數(shù)據(jù)結(jié)構(gòu)與算法——插入排序

碼字不易,如對(duì)您有幫助,歡迎點(diǎn)贊收藏打賞^_^

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71079.html

相關(guān)文章

  • Java面試題:穩(wěn)定和不穩(wěn)定排序算法之間的區(qū)別-MergeSortQuickSort

    摘要:穩(wěn)定與不穩(wěn)定算法示例以下圖片解釋了穩(wěn)定和不穩(wěn)定的排序是如何工作的這就是穩(wěn)定和不穩(wěn)定排序算法之間的區(qū)別。穩(wěn)定排序算法的一些常見示例是合并排序,插入排序和冒泡排序。 showImg(https://segmentfault.com/img/remote/1460000018913243); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個(gè)程序員的故事 網(wǎng)...

    wanghui 評(píng)論0 收藏0
  • 七大排序算法總結(jié)(java)

    摘要:前面介紹了七大算法的思想與實(shí)現(xiàn)步驟,下面來做一個(gè)歸總。直到無序區(qū)中的數(shù)為零,結(jié)束排序。步驟以從小到大為例,排序數(shù)組大小為。比較完以后則排序結(jié)束。堆排序思想堆排序是采用樹的形式的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行排序的,其中每一個(gè)堆都是完全二叉樹。 前面介紹了七大算法的思想與實(shí)現(xiàn)步驟,下面來做一個(gè)歸總。 排序方法 平均復(fù)雜度 最壞復(fù)雜度 最好復(fù)雜度 輔助空間 穩(wěn)定性 直接選擇排序 O(n^2...

    cartoon 評(píng)論0 收藏0
  • Java數(shù)據(jù)結(jié)構(gòu)算法——插入排序

    摘要:當(dāng)序列本身有序時(shí),插入排序的時(shí)間復(fù)雜度為。因?yàn)榇藭r(shí)的分區(qū)內(nèi)數(shù)據(jù)往往是近似有序的,所以使用快排并不一定優(yōu)于插入排序。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇文章介紹排序算法中插入排序算法,包括插入排序的思路,適用場(chǎng)景,性能分析,java代碼等 0、其他排序算法索引(待更) java數(shù)據(jù)結(jié)構(gòu)與算法——快速...

    騫諱護(hù) 評(píng)論0 收藏0
  • 跳槽季如何快速全面復(fù)習(xí)面試題

    摘要:排序算法和集合工具類排序算法和集合工具類。面試官總是問排序算法也不是在難為你,而是在考察你的編程功底。你首先要理解多線程不僅僅是和那么簡(jiǎn)單,整個(gè)并發(fā)包下面的工具都是在為多線程服務(wù)。 去年的這個(gè)時(shí)候樓主通過兩個(gè)月的復(fù)習(xí)拿到了阿里巴巴的 offer,有一些運(yùn)氣,也有一些心得,借著跳槽季來臨特此分享出來。簡(jiǎn)單梳理一下我的復(fù)習(xí)思路,同時(shí)也希望和大家一起交流討論,一起學(xué)習(xí),如果不對(duì)之處歡迎指正一...

    keke 評(píng)論0 收藏0
  • Java排序算法之——快速排序

    摘要:代碼片段語言組織能力有限,直接上代碼排序算法之快速排序參數(shù)為需要排序的數(shù)組參數(shù)為數(shù)組的起始下角標(biāo)即參數(shù)為數(shù)組的最后下角標(biāo)即經(jīng)過一輪排序,已經(jīng)將數(shù)組分為左右兩部分進(jìn)行遞歸排序總結(jié)快速排序的精髓在于分治思想,分而治之,它的時(shí)間復(fù)雜度為。 算法簡(jiǎn)述 所謂快速排序算法是基于交換排序和遞歸思想的,它的速度的確如名字所示——快!并且這種一算一般被用作數(shù)量級(jí)比較大的數(shù)據(jù)當(dāng)中,在大數(shù)據(jù)中有著很重要的地...

    Yangyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<