1. 程式人生 > >演算法筆記--快速排序

演算法筆記--快速排序

基本思想:

將當前待排序列分成兩個部分、一個值。一個值:就是選定出一個值作為被比較的元素(基準數)。兩個部分:所有比該被選定元素大的部分都去該元素的右邊,所有比被選定元素小的部分都去該元素的左邊。這樣我們就確定了該元素在這個待排序列中的位置,其實也就是我們已經將這個元素“排好了”。

舉例:

快速排序的每一輪處理其實就是將著一輪的基準數歸位,直到所有的數都歸位為止,排序就結束了。

演算法實現:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        for (int i = 0; i < 10; ++i) {
            scanf("%d", &number[i]);
        }
        quickSort(0, 9);
        for (int i = 0; i < 10; ++i) {
            printf("%d\t", number[i]);
        }
        
    }
    return 0;
}



//**【快速排序】**//
int number[10];
void quickSort(int left, int right) {
    
    if (left >= right) {
        return;
    }
    int temp = number[left];//基數
    int i = left;
    int j = right;
    
    while (i != j) {
        
        //從右向左走
        while (number[j] >= temp && i < j) {
            j--;
        }
        
        //從左向右走
        while (number[i] <= temp && i < j) {
            i++;
        }
        
        if (i < j) {//把大數換到右邊,把小數換到左邊
            int t = number[i];
            number[i] = number[j];
            number[j] = t;
        }
    }
    
    //交換基數
    number[left] = number[i];
    number[i]    = temp;
    
    
    quickSort(left, i-1);//左側遞迴
    quickSort(j+1, right);//右側遞迴
    return;
}
參考啊哈磊的《啊哈!演算法》一書。

相關推薦

演算法筆記-快速排序之無序陣列中查詢中位數

問題描述: 給一個無序陣列array和陣列長度n,找出其中的中位數(這裡考慮n為奇數) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100

演算法筆記--快速排序

基本思想:將當前待排序列分成兩個部分、一個值。一個值:就是選定出一個值作為被比較的元素(基準數)。兩個部分:所有比該被選定元素大的部分都去該元素的右邊,所有比被選定元素小的部分都去該元素的左邊。這樣我們就確定了該元素在這個待排序列中的位置,其實也就是我們已經將這個元素“排好了

演算法筆記-快速

快速冪就是快速的求底數的整數次方,比起樸素的方法O(n)的時間複雜度,其時間複雜度是O(log2n)。這是很不錯的一個效率提升。 通常要求一個數X的Y次方,記做X^Y,樸素的計算方法是把X乘Y次得到這個結果。 而快速冪計算的過程是,對於指數Y進行奇偶性的判斷。為了方便解釋,

經典排序演算法之--快速排序

快速排序是一種高效但不穩的排序演算法,不穩性取決於比較基數的選擇帶有隨機性,其排序原理應用百度百科如下: 設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排

c#程式碼實現排序演算法快速排序

快速排序的平均時間複雜度為O(nlog2n),最好時間複雜度為O(nlog2n),最壞時間複雜度為O(n²),空間複雜度為O(log2n),是一種不穩定的演算法。 1.劃分:選定一個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子序列r(1)…r(i-1)和r(i+1)…r(n)

排序演算法二--快速排序

快速排序(Quicksort) 基本思想:(分治) 先從數列中取出一個數作為key值; 將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊; 對左右兩個小數列重複第二步,直至各區間只有1個數。 輔助理解:挖坑填數

演算法(5) 快速排序 java

快速排序是對世界影響最大的排序演算法之一,至於其背景之類的知識可百度獲取. 思路如下: 假設待排序陣列如下 現在要將4 放到4 應該放到的位置,快速排序的思想是將整個陣列劃分為兩部分,一部分的資料都小於等於4,另一部分的資料都大於4,如下圖: 繼續抽

常見排序演算法快速排序

文章目錄 前言 思路 實現過程 基本演算法 切分方法 複雜度分析 最優時間複雜度的數學證明 演算法改進 切換到插入排序 三取樣切分 三向

PHP排序演算法快速排序

原理:找到當前陣列中的任意一個元素(一般選擇第一個元素),作為標準,新建兩個空陣列left、rignt,遍歷整個陣列元素,如果遍歷到的元素比當前的元素小就放到陣列left,比當前的元素大放到rignt,然後再對新陣列進行同樣的操作。 遞迴:遞迴是一種函式呼叫自身的機制。遞迴必須要有邊界條件,也就是遞迴出口(

13_資料結構與演算法_快速排序_Python實現

#Created By: Chen Da """ 快速排序的思想: 選擇基準值pivot將陣列分成兩個子陣列,小於基準值的元素和大於基準值的元素;這個過程稱為partition 對兩個子陣列進行快速排序; 合併結果。 """ #一個簡單粗暴的遞迴快排 def quik_s

【資料結構與演算法】 ---快速排序

快速排序流程: 1.從數列中挑出一個基準值 2.將所有比基準值小的擺放在基準前面,所有比基準值大的擺在後面(相同的數可以放到任一邊);在這個分割槽退出之後,該基準就處於數列的中間位置。 3.遞迴地把“基準值前面的子數列”和“基準值後面的子數列”進行排序。   下面以數列

基礎演算法筆記-氣泡排序

氣泡排序(Bubble Sort)  之前大一的時候學的第一個排序就是氣泡排序,那時候用的是C語言,現在用java語言複習一下做個筆記,歡迎批評指點錯誤。  作用:   排序,就是將幾個數從小到大或者從大到小的順序排列。就像小學生排隊回家一樣(ps:小學生除了會排位,還是會排隊的

排序演算法快速排序【java實現】

快速排序是最常用的排序演算法之一,它的平均時間複雜度是O(nlogn),但是它是一個不穩定的演算法。 步驟: 我們要找到一個基值,將小於基值的放在它的左邊,大於它的放在它的右邊。基值我們直接用陣列最左邊的值就行。每次排序會把基值放在正確的位置上,在根據這個值把陣列分成左右兩部分,在進行遞迴處

排序演算法04-快速排序

上一篇文章講述了歸併排序,其實快速排序是基於歸併排序的,二者都是基於分而治之的演算法設計思想,下面講述快速排序與歸併排序的不同之處: 1.歸併排序分割陣列屬於“貨真價實”的分割,建立了兩個新陣列接收分割後的兩個新陣列,而快速排序則通過下標標記來分割,不會建立新陣列; 2.歸併排序分割位置是固

演算法筆記 — EXCEL排序 ( HDU-1862)

  題目連結:http://www.codeup.cn/problem.php?cid=100000581&pid=2 題目描述 Excel可以對一組紀錄按任意指定列排序。現請你編寫程式實現類似功能。 對每個測試用例,首先輸出1行“Case i:”,其中 i 是

演算法快速排序

轉載地址:https://mp.weixin.qq.com/s/e5iF6zIf_ZpaxkVVANf6nA   【資料結構與演算法】 通俗易懂講解 快速排序   快速排序介紹 快速排序(Quick Sort)使用分治法策略。它的基本思想是:選擇一個基準數,通

五分鐘學會一個高難度演算法快速排序

前言 由於LeetCode上的演算法題很多涉及到一些基礎的資料結構,為了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解資料結構》,主要使用動畫來描述常見的資料結構和演算法。本系列包括十大排序、堆、佇列、樹、並查集、圖等等大概幾十篇。 快速排序 快速排序是由東尼·霍爾所發展的一種

排序演算法快速排序(關鍵詞:資料結構/演算法/排序演算法/快速排序

快速排序 實現 def partition(nums, left, right): middle = (left+right) // 2 pivot = nums[middle] swap(nums, middle, right) # 現在主元 pivot 等於 num

java版排序演算法快速排序

快速排序的思想 快速排序是通過切分的方式將大陣列切分為左右兩個子陣列,分別對兩個子陣列進行遞迴的切分,當左右兩個子陣列都有序時整個陣列便有序了。 程式碼實現 public clas

資料結構與演算法快速排序

快速排序顧名思義,在大部分情況下都能快速的將資料進行排序。百度百科快速排序的定義:通過一趟排序將要排序的資料分成獨立的兩部分,其中一部分的資料比另一部分的所有資料都要小,然後再按照這個方法對這兩部分進行快速排序,排序以遞迴進行,從而達到將整個資料變成有序序列。快速排序的平均執