一天一演算法(1) 快速排序

2021-09-30 20:37:25 字數 1200 閱讀 8868

我去網上檢視了快速排序的**,千篇一律,**簡直乙個模子裡面印出來的,這樣沒意思,用的都是別人的思路。於是我自己動手寫了乙個,雖然**不夠簡潔,但是我覺得排序的目的應該達到了

快速排序演算法無非就是利用左右兩個指標,向左或者向右遍歷陣列,並且與基準點比較,從而達到排序的目的

首先:假設我們的無序數列是:5,11,1,2,8,6,9

然後宣告兩個int變數i和j,然後我們讓 i 和 j 分別指向陣列的兩端,第一次遍歷的話,i=0,j=6,基準點為5。

之後我再宣告乙個int型別的變數step,當step=0時,代表由右向左遍歷陣列,當step=1時,代表從左向右遍歷陣列。

開始:i=0 , j=6,step=0,基準點為5

第一次尋找:

j=6,所以 j 指向9,step=0,所以由右向左遍歷,因為9>5,所以我們讓 j–,直到找到小於5的數,當 j=3的時候,指向的2小於5,則讓2替代以 i 為索引的數,然後將step置為1,這時無序陣列為:2,11,1,2,8,6,9 ,各個引數為 i=0 , j=3 ,step=1

第二次尋找:

由於step=1,所以由左向右遍歷,我們讓 i++,直到找到第乙個比5大的數,所以在 i=1的時候,找到11比5大,則讓 11 替代以 j 為索引的數,之後將step置為0,這時無序陣列為:2,11,1,11,8,6,9 ,各個引數為 i=1 , j=3 ,step=0

第三次尋找:

step=0,所以由右向左遍歷,讓 j–,直到找到小於5的數,當j=2的時候,找到1 小於5,所以讓 1 替代以 i 為索引的數,之後將step置為1,這時無序陣列為:2,1,1,11,8,6,9 ,各個引數為 i=1 , j=2 ,step=1

第四次尋找:

由於 i=1 , j=2 所以沒有遍歷的必要了,我們將5直接替代 以 j 為索引的數,所以無序陣列為:2,1,5,11,8,6,9

這時我們發現,5左邊都是比他小的數,右邊都是比他大的數。

最後:我們利用遞迴,對5左邊和右邊的數執行快速排序就行了。

public static void fastsort(long a, int front, int low)

else

break;}}

a[front] = k;

if (low=right)

return;

fastsort(a, front+1,right);

}

一天一演算法之歸併排序

歸併排序是3個時間複雜度為o nlogn 唯一乙個穩定的演算法,不過自己沒有實現出來。還好別人的 看懂了。using system using system.collections.generic using system.linq using system.text namespace sort ...

一天一演算法(43) 最小k個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,超級簡單的題目,就是考察排序演算法而已 為了熟悉堆排序,使用了堆排 using system.collections.generic class solution heapsort...

一天一演算法(18) 有效的數獨

有效的數獨 判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格...