1. 程式人生 > >快速排序---簡解

快速排序---簡解

快速排序是真的塊。

簡單的說一下快排的思想:

第一步,找出一個鍵值,通常取第一個元素,用temp中間變數暫存,left和right為排序範圍的左邊界和右邊界。

第二步、從右邊找出比temp小的放入i下標的位置。i++。

第三步、從i+1的位置往後找到比temp大的值放入j下標處。

第四步、知道i >=j..

第一次排序做好了,然後重複步驟。。排序left到j - 1,i+1 到right。

void quickSort(int a[],int left,int right)
{
    int i = left;
    int j = right;
    int temp = a[left];
    
    if(i >= j )  //說明不需要排序了
        return;

    while(i != j)
    {
        while(i < j && a[j] >= temp)//尋找比temp小的值
            j--;
        if(i < j)
            a[i] = a[j];//把小的值放入
        while(i < j && a[i] <= temp)//尋找比temp大的值
            i++;
        if(i < j)
            a[j] = a[i];
    }
        a[i] = temp;
        quickSort(a,left,j-1);
        quickSort(a,i+1,rigth);
}

 快速排序具有最好的平均效能(average behavior),但最壞效能(worst case behavior)和插入排序相同,也是O(n^2)。比如一個序列5,4,3,2,1,要排為1,2,3,4,5。按照快速排序方法,每次只會有一個數據進入正確順序,不能把資料分成大小相當的兩份,很明顯,排序的過程就成了一個歪脖子樹,樹的深度為n,那時間複雜度就成了O(n^2)。儘管如此,需要排序的情況幾乎都是亂序的,自然效能就保證了。據書上的測試圖來看,在資料量小於20的時候,插入排序具有最好的效能。當大於20時,快速排序具有最好的效能,歸併(merge sort)和堆排序(heap sort)也望塵莫及,儘管複雜度都為nlog2(n)。

相關推薦

快速排序---

快速排序是真的塊。 簡單的說一下快排的思想: 第一步,找出一個鍵值,通常取第一個元素,用temp中間變數暫存,left和right為排序範圍的左邊界和右邊界。 第二步、從右邊找出比temp小的放入i下標的位置。i++。 第三步、從i+1的位置往後找到比temp大的值放

高階排序-快速排序

輔助工具 概述 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,

Java氣泡排序快速排序

氣泡排序   氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

藍橋杯之快速排序

快速排序排序在各種場合經常被用到。快速排序是十分常用的高效率的演算法。其思想是:先選一個“標尺”,用它把整個佇列過一遍篩子,以保證:其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。再分別對子區間排序就可以了。下面的程式碼是一種實現,請分析並

快速排序C++

        題目:將亂序陣列按從小到大排列。陣列中是允許出現重複數字的。         思路挺簡單:         (1

php冒泡排序快速排序實例詳

lag ++ function 開始 ret light 記錄 php冒泡排序 php $a=array(‘3‘,‘8‘,‘1‘,‘4‘,‘11‘,‘7‘); print_r($a); $len = count($a); //從小到大 for($i=1;$i<$le

js實現快速排序,二分查詢 (詳,一次學會)

js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩 一,快速排序 大致分三步: 在資料集之中,選擇一個元素作為"基準"(pivot)。 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 對"基準"左邊和右邊的兩個子集,不斷重複

幾種排序方法詳(選擇排序、氣泡排序、插入排序快速排序

由於本帖只是闡述幾種排序方法的原理、如何區分以及編寫幾種排序的簡單程式碼,所以直接給定陣列是 a[ ]={6,2,8,5,1},需要把以上5個數字按升序排列 1. 選擇排序法 (如果不想看解釋分析,直接往後拉看程式碼) 實質: 第一輪:通過對比陣列中前一個元素和後一個元素

快速排序(Quicksort)詳(動畫程式碼)

快速排序只一種基於分治策略(divide and conquer)的經典排序演算法,並且是一種原地(in-place)排序,實現原地排序的依據是用兩個陣列下標(start,end)來確定當前待排序子陣列的範圍。 切分(partition)步驟(關鍵): 在對子陣列進行排序時,本質上是在確定子

快速排序 java詳

1.快速排序簡介:   快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。 2.快速

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (答題需要人工評分)

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現  [分值:20] 您的回答:(空)  (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */

快速排序(Quicksort)詳

快速排序只一種基於分治策略(divide and conquer)的經典排序演算法,並且是一種原地(in-place)排序,實現原地排序的依據是用兩個陣列下標(start,end)來確定當前待排序子陣列的範圍。 切分(partition)步驟(關鍵): 在對子陣列進行排序

Python四大流行排序演算法詳--快速排序-氣泡排序-選擇排序-插入排序

就作者而言使用Python經常用到的排序演算法就是快速排序、氣泡排序、選擇排序以及插入排序       就時間複雜度而言,快速排序是高階排序,查詢快速,時間複雜度為nlgn      而氣泡排序、選擇排序、插入排序則是比較低階的查詢演算法,時間複雜度為n**2 下面

快速排序演算法詳(原理、實現和時間複雜度)

快速排序是對氣泡排序的一種改進,由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料比另一部分的所有資料要小,再按這種方法對這兩部分資料分別進行快速排

九種經典排序演算法詳(氣泡排序,插入排序,選擇排序快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序

綜述 最近複習了各種排序演算法,記錄了一下學習總結和心得,希望對大家能有所幫助。本文介紹了氣泡排序、插入排序、選擇排序、快速排序、歸併排序、堆排序、計數排序、桶排序、基數排序9種經典的排序演算法。針對每種排序演算法分析了演算法的主要思路,每個演算法都附上了虛擬

O(n*logn)級別的演算法之二(快速排序)的三種實現方法詳及其與歸併排序的對比

快速排序被稱為二十世紀演算法界的一大傑作 一,單路快排 1.測試用例: #ifndef INC_06_QUICK_SORT_DEAL_WITH_NEARLY_ORDERED_ARRAY_SORTTESTHELPER_H #define INC_06_QUICK_

八大排序演算法詳——快速排序

基本思想 設當前待排序的陣列無序區為R[low..high],利用分治法可將快速排序的基本思想描述為: 分解: 在R[low..high]中任選一個記錄作為基準(Pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間R[low..pivotpos-1)和R[pivotpos+1..hig

二分查詢、快速排序對比和詳

這兩個都是用到分治的思想很容易搞混。而且即使binarySearch是用到分治也不一定意味著一定要用遞迴去實現,可以通過迴圈實現。二分查詢和快速排序屬於面試筆試的高頻問題有必要總結一下。 由於迴圈相比遞迴少了很多記憶體分配和壓棧的操作開銷會少很多,所以

排序快速排序及其非遞迴實現,歸併排序

快速排序   快速排序(Quicksort)是對氣泡排序的一種改進。   我們知道快速排序用的是分治的基本思想:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴的解決這些子問題,然後將這些子問題的解組合為原問題的解。   快速排序的基本思想是:

演算法精----快速排序(方式1)

前言: 快速排序工作原理就是先在序列中找到一個基準值,我稱為K值。然後小於K的放在K的前面,大於K的放在K的後面。其實我們每操作K一次,就相當於把序列分為兩個部分,一部分大於K,一部分小於K,就這樣周