重新上本科 快速排序 下

2021-06-08 17:29:11 字數 1170 閱讀 6872

在我的印象中,絕大多數的教科書講解快速排序的時候,都用嚴蔚敏書中的方法,採用左右兩個迭代指示器,從兩個方向進行遍歷比較。能不能只從乙個方向進行遍歷,遍歷一遍就能完成交換任務呢?《演算法導論》提供了一種方法。

《演算法導論》是從左到右遍歷,設定兩個指示器(從這個角度來說本質上與嚴蔚敏的方法一致),乙個指示器指示當前遍歷的位置,另乙個指示的位置,該位置之前的元素(直到陣列起始位置)的值都小於錨值,該位置之右的元素的數值都大於錨值。隨著第乙個指示器的遍歷,遇到比錨值小的元素,就與第二個指示器指示的位置的元素交換,兩個指示器分別向右移動乙個位置,直到第乙個指示器遍歷完整個陣列。這部分**如下:

int i = ilow;                               // 遍歷指示器i,i左邊的元素都比錨值小,右邊的元素都比錨值大

int ival = array[ihigh];               // 錨值設定為最後乙個元素,與上面兩種方法不同,這個取決於遍歷陣列的方向,總在該方向末尾的元素

for (int j=ilow; j= i,等號只在開始遍歷時成立 }

int itemp = array[i];                  // 邊界情況,當跳出迴圈,將array[ihigh]存放的錨值,與位置i的元素交換;兩個子串行區間是[ilow, i)和(i, ihigh].

array[i] = array[ihigh];

array[ihigh] = itemp;

完整的演算法**是:

void quicksort3 (int array, int ilow, int ihigh)

}int itemp = array[i];                  // 邊界情況,當跳出迴圈,將array[ihigh]存放的錨值,與位置i的元素交換;兩個子串行區間是[ilow, i)和(i, ihigh].

array[i] = array[ihigh];

array[ihigh] = itemp;

} //if }

快速排序,經典演算法。當初上課的時候,應付考試,背下來就行了,就足夠應付大部分考試。而後,面試的時候,基本上也是被下來就行,因為基本原理大家都清楚。但是,真正是否清楚了?我覺得,還是要把背下來的東西統統忘掉之後,再自己寫一遍這個演算法,才是真的清楚了其中的思想、細節。這樣,心裡才真正踏實,否則總有一種飄到空中的感覺,兩腳不落地。

重新上本科 快速排序 中

直接看一下嚴蔚敏的 資料結構 他是這麼處理的 他利用了錨值位置上的值,參與到交換過程之中。演算法的過程變為 首先,右迭代指示器從右向左遍歷,找到第乙個比錨值小的數值的位置,並將錨值 預設是陣列第乙個元素 與當前位置的數值相交換 此時,右迭代指示器停止,迭代器指向的位置作為臨時變數,存放錨值,該位置向...

重新上本科 堆排序 上

堆排序很有意思。作為排序演算法來講,它和快速排序都是o nlogn 的時間複雜度,都是就地排序,都是採用遞迴。兩者差不多,既生瑜,何生亮?不過堆是一種很有用的資料結構,通過堆排序演算法,可以學習堆這種資料結構,以後可能用得上。堆排序演算法思路很簡單 第一步,構建乙個堆 第二步,取出堆頂 第三步,如果...

重新上本科 排序 除錯環境

上面列了幾個排序演算法的 這些 都是經過debug,程式驗證過的。我順便也把驗證的環境貼出來吧。很多東西,其實是寫給自己看的。一 隨機數生成程式,生成一定數量的隨機數,用於排序,結果記錄在檔案中。bool generatenum const char sfileout,int icount if i...