C 快速排序演算法基礎入門篇

2022-02-15 20:33:04 字數 3553 閱讀 8844

相信演算法對於許多開發人員來說都是一大難點,之所以難,就像設計模式一樣,許多人在閱讀之後,沒有很好地理解,也不願意動手上機操作,只停留在理論的學習上面,隨著時間推移就慢慢淡忘。

有些東西,你可以發明創造,但是有些東西呢,你要麼死記硬背,要麼好好理解並動手進行練習來鞏固。搞開發的話,死記硬背沒用,好好理解火候還是差一點。最好的方式,還要在理解的基礎上多敲敲**,使自己即知其然,又知其所以然。

本篇只是簡單介紹快速排序演算法,大牛可以從旁幫忙指點,但是請嘴下留情哦:)

快速排序演算法定義

快速排序(quicksort)是對氣泡排序的一種改進。由c. a. r. hoare在2023年提出。

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

快速排序演算法講解

假設現有一組整型資料需要你用快速排序的演算法來進行排序(如int unsort = ,假設以第乙個資料3作為左右資料的分隔數)

那麼執行完int midposition =quicksort(unsort, left, right);這一句的時候,得出的陣列結果是:

{2, 1,3,4, 7, 5},並且midposition返回資料3的索引位置(即為索引2)。

這樣之後,就可以根據3為分隔數(3的位置已經排好序),把資料分為{2, 1},{ 4, 7, 5}兩部分,然後通過遞迴的方式進行排序。

下面的**我覺得很好理解,雖然在網上看到有很多可以改進的地方,但是這都不是本文的重點。本文只是入門的內容,能簡單理解,盡量簡單。畢竟要複雜些,我也寫不出來。

唯一不好理解的地方,就是怎麼去理解分隔數的位置。就我本人來說吧,以前在大學時也沒學好,以至於後面來學習的時候,總會先入為主,覺得好難好難。人有牴觸的心結在的話,做事情往往是事倍功半。

所以在我花大部分時間去理解好分隔數的位置之後,下面這種快速排序演算法就能自己手動敲打出來了。理解了之後,再動手實踐能鞏固學習到的知識。

(1)預先定好乙個分隔數,預設為第乙個數(如我們講到的例項3,我們假設是按照從小到大的順序排序)

(2)按照先從右端和左端向中間的方式來進行排序(一趟排序只是排好分隔數的位置,並且分隔數左部分的資料都比右部分的資料要小)。

右端先開始排序,如果右端的資料比分隔數要大時,則位置不用改變。一旦出現右端的資料比分隔數要小時,則需要把右端的這個小資料挪到左邊去,具體看下面步驟說明。

並且排序方向改為從左端開始,如果左端的資料比分隔數要小時,則位置不用改變。一旦出現左端的資料比分隔數要大時,則需要把左端的這個大數挪到右邊去。

並且排序方向又改為從剛才已到達的右邊位置再進行排序。

其實說白了,就是開始時,我們從左邊拿出了乙個數存給乙個變數(分隔數),相當於左邊留出了乙個空位,讓分隔數右邊的數(這個數小於分隔數)來存放,一旦存放了,則右邊就空出乙個空位,等待分隔數左邊的數(這個數比分隔數要大)來存放,反正就這麼一直調來調去,調到沒得調了,剩下的空位就是分隔數的位置。

步驟:第一小步:把3賦值給乙個儲存的變數,假設是 int splitnum = 3 (而陣列3的這個位置到時將會給比3小的數占用)。我們可以理解為陣列3這個數暫時是乙個空位

即:,x代表空位

第二小步:拿splitnum跟右端的5來進行比較(跟右端比較的目的是什麼,當然是想把比3大的數保留在3的右邊,比3小的數放在3的左邊),5大,所以5右邊不變

即:第三小步:拿splitnum跟右端的7來進行比較,7大,所以7右邊不變

即:第四小步:拿splitnum跟右端的1來進行比較,splitnum大,所以x賦值為1(那麼原先陣列1的索引位置就是乙個空位)

即:第五小步:拿splitnum跟左端的1來進行比較,(跟左端比較的目的是什麼,當然是想把比3大的數放到3的右邊,比3小的數保留在3的左邊),splitnum大,所以1不變

即:第六小步:拿splitnum跟左端的2來進行比較,splitnum大,所以2不變

即:第七小步:拿splitnum跟左端的4來進行比較,4大,所以x賦值為4,(那麼原先陣列4的索引位置就空出來了)

即:第八小步:由於兩天都比較完了,那x賦值為splitnum的值

即:從而實現以3為分隔數,3左邊的數都比3右邊的數要小(按照從小到大的順序排序)

快速排序演算法**

namespace

sort

; result =getprint(unsort);

console.write(

"排序前結果: ");

console.writeline(result);

//快速排序

quicksort(unsort, 0, unsort.length - 1

); result =getprint(unsort);

console.write(

"排序後結果: ");

console.writeline(result);

console.readline();

}//////

呼叫快速排序演算法

/// ///

待排序的整形陣列

///左邊起始點

///右邊結束點

public

static

void quicksort(int unsort, int left, int

right)

}//////

獲取一次排序的中間索引位置

/// ///

待排序的整形陣列

///左邊起始點

///右邊結束點

public

static

int getsplitnum(int unsort, int left, int

right)

unsort[left] =unsort[right];

/*** 從從端開始比較

* (1)假如從左端過來的數比分隔數要小,則不用處理

* (2)假如從左端過來的數比分隔數要大,則需要挪到分隔線右邊

* */while (left < right && splitnum >=unsort[left])

unsort[right] =unsort[left];

}//一趟比較之後,分隔數的位置就可以確認起來

unsort[left] =splitnum;

return

left;

}//////

列印輸出結果

/// ///

資料 public

static

string getprint(int

unsort)

", n);

}else

", n);}}

return

result;}}

}

GDB除錯(快速入門篇)

在linux平台下使用log gdb core,一般能應付絕大多數除錯程式的場景 使用者文件查閱 編譯程式時 上 g選項,關閉優化機制和建立符號表以便偵錯程式除錯 gcc g g 你能用gdb對c c 程式做什麼?1 啟動程式 2 使程式在指定條件下停止 3 當程式停止時,檢查發生了什麼 4 更改程...

雜湊演算法》入門篇

兩段字串,判斷它們是否相等,樸素解法是乙個乙個的判斷,時間復制度較大。雜湊演算法把字串轉換成整數,這樣時間複雜度從o n 變成了o 1 類似於二進位制,用p進製將字串裝換成整數,為避免重複,一般認為p取131或者1331,使用unsigned long long 就可以,預設對結果模乙個2 64,會...

KMP演算法 入門篇

字串匹配問題 給出乙個源字串和乙個目標字串,能否在源串中找到匹配目標串的子串,找到的話就返回首字母在源串的下標 暴力匹配演算法 bf演算法 相對於烤饃片 kmp 演算法,暴力演算法是最簡單易懂的,就是從前向後遍歷源串的每乙個字母向後檢視以該字母的子串,當且僅當起點字母後面的每個字母都匹配成功則返回該...