我去網上檢視了快速排序的**,千篇一律,**簡直乙個模子裡面印出來的,這樣沒意思,用的都是別人的思路。於是我自己動手寫了乙個,雖然**不夠簡潔,但是我覺得排序的目的應該達到了
快速排序演算法無非就是利用左右兩個指標,向左或者向右遍歷陣列,並且與基準點比較,從而達到排序的目的
首先:假設我們的無序數列是: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 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格...