排序方法之 快速排序法 以及學習中遇到的問題

2022-07-12 05:36:08 字數 1964 閱讀 4731

演算法大體描述:選乙個數作為基數,將大於這個數的放到它的右邊,將小於這個數的放到它的左邊,第二趟將陣列從基數的地方分為兩個並重複選擇基數,重複上述步驟

我對此排序法的看法:難點我覺得就是①怎樣將基數放到中間的位置,即左邊的全小於基數,右邊全大於基數 ②怎樣將按第一步排列好的陣列在它前後兩個位置分開再繼續進行劃分

解決的方法是:對於第乙個難點:定義兩個位置變數,分別從陣列的頭尾開始計數,大於基數的減一,小於基數的加一,這樣就可以找到兩邊不符合的條件的資料,找到後將他們進行互換,最後若兩個位置變數指向同一位置,則將此時位置變數對應的值與開頭的變數進行互換即可。對於第二個難點,因為要重複上一步驟,所以要採取遞迴的思想,因為要從不同位置開始結束,所以要再定義開頭begin變數與結尾end變數,每次都界定在這個範圍內進行。

執行**void quick_sort(int *arr,int begin,int end){ //快速排序法 if(begin>=end) return; //void我一直以為是空函式,所有不需要有return語句,後來看到別人的**裡面有這個去找了一下,發現他是在void裡面的強制終止函式進行,我剛開始時使用printf("wrong!")來顯示錯誤,但這樣執行的結果總是出現wrong!,我剛開始怎麼也看不出錯誤來,後來發現是因為不是第乙個比較時出現了錯誤,而是在最後分到不能再分的時候出現了 int tmp=arr[begin]; int i=begin; int j=end; while(i!=j){ while(arr[j]>=tmp&&i在學習中遇到的其他問題:

一、關於如何求時間複雜度的問題

①對於乙個迴圈,迴圈體的複雜度為o(n)迴圈次數為m,則這個迴圈的時間複雜度為o(mn)

②對於多個迴圈,假設迴圈體的時間複雜度為o(n)各個的迴圈次數分別是a,b,c……則這個迴圈的時間複雜度為o(nabc)分析時應由內向外分析

③對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度(即有兩個for,分開不是分層,其中有乙個是o(n²)其中乙個是o(n)則總的時間複雜度為o(n²))

④對於有if語句的程式,時間複雜度也應該選擇最大路徑的時間複雜度

算時間複雜度的基本原則:由內向外,從最深層開始分析,分析最深層語句所需要做的次數。

二:關於c++中引用符&的一些語句的用法問題

如何理解const t &和 t &是不同的型別,t &型別的引用或者t型別的變數可以用來初始化const t &型別的引用,而const t型別的常變數和const t &型別的引用則不能用來初始化t &型別的引用,除非進行強制轉化?

例:const char cc=『a』; char c; const char & rcc =cc; const char & rc =c; //char 或者 char &型別可以初始化帶const型別的引用 char &r =cc //錯誤!const char 型別不可以初始化char &型別的變數 char & r2 =(char &)cc //可以

總之帶有const關鍵字的引用變數可以用不帶const的普通變數或者引用變數來初始化,而不帶有const的引用變數只能由普通變數或者不帶const的引用變數來初始化,非要用const的話就要使用強制轉化符。

關於const的用法的疑惑還有一點:在我使用棧時定義全域性maxsize的值時,我開始用elemtype maxsize=4;來定義時編譯老是出現error: array bound is not an integer constant before 『]』 token這個錯誤,後來上csdn上發現要在前面加上const,加上了後果然編譯通過了,所以我去查了下const在全域性變數這的用法,因為棧的定義時會用到elemtype data【maxsize】,而陣列array中量必須是編譯時的已知常量,當我用int maxsize = 4;這裡的maxsize其實是乙個全域性變數,加上const後就變成了乙個不可改變的全域性常量,也即符合陣列的資料規則,所以**得以編譯通過。

經典陣列排序方法 快速排序法

一 截圖 二 快速排序詳解 快速排序法 quicksort 是一種非常快的對比排序方法。它也divide and conquer思想的實現之一。自從其產生以來,快速排序理論得到了極大的改進,然而在實際中卻十分難以程式設計出正確健壯的 本文將對快速排序演算法的基本理論和程式設計實踐方面做作乙個全面的講...

挖坑法之 快速排序

速度快,耗時小,面對資料量大的題目時可用快排 選取基準數,不斷 挖坑 填坑 使小於基準數的數全在其左邊,大於其的數全在右邊 最後陣列有序 參考鏈結 選擇最左端的數為基準數x 可將其視為乙個坑,可以將別的數填入這個坑 從右往左尋找小於x的數y,找到後填入坑,此時原基準數的坑被填,而y處產生新的乙個坑,...

演算法 之 快速排序法

快速排序演算法 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行 關鍵點 遞迴,折半 通常取第乙個數為對比 時間複雜度 平均 n logn function sort half a...