前兩天手寫快速排序,最後得到的結果是錯誤的而且還錯的非常奇怪。輸入的待排序陣列是:
int a[10] = ;
最後得到的結果是:
0020006
080
上網看了看別人的**,發現我寫的快速排序的演算法邏輯是沒有錯誤的,難道是交換元素時用的演算法不對?
我用的交換演算法是異或交換,就是不用中間變數那種:
void swap( int *a, int *b )
然後將其換成使用中間變數的交換演算法:
void swap( int *a, int *b )
然後結果就對了,但是一直想不明白為什麼。最後通過在紙上演算一遍才恍然大悟。
例如我這個輸入:
26 4
8 0
1 5
9 3
7
中間的比較交換過程略去不表,然後它會到達這麼乙個狀態:
0 /1 /
2 /
8 4
6 5
9 3 7^
^
解釋一下,第一輪排序將2放到屬於它的位置,然後分成左邊的序列0 1和右邊的序列8 4 6 5 9 3 7。第二輪對左邊的0 1進行排序,將0放置到屬於它的位置(沒動)。第三輪對1進行排序,問題就出在這裡,由於只有乙個元素,但按照演算法也要進行一次交換,如果使用不借助中間變數的交換演算法(加減法、異或法),傳遞給void swap( int *a, int *b )的a, b指向的是同一位址,也就是說實際上是這樣的:
void swap( int *a, int *a )
其實在第二輪時,0與0交換就出現了這個問題,但是由於它是0沒有表現出來。
以前總覺得不用中間變數的交換演算法稍微有那麼點帥,看來還是得想好了再用。可靠性最重要啊。
排序演算法 交換演算法
1.先定義一些基礎函式 1 include 2 3using namespace std 45 void swap int a,int b 611 12int main 13 15int n sizeof a sizeof a 0 16 17bubblesort a,n 具體演算法見後面章節 18q...
排序演算法 交換排序 快速排序演算法
快速排序演算法 列印資料 void print list int data list int left int right printf n 核心排序 找到基準位置 挖坑法 int core sort int data list int left int right if i j while i j...
排序演算法之快速排序 左右交換
public class fastsort public static void fastsort int arr,int left,int right else 選取基準元素對陣列進行分割槽,分割槽點左邊全部小於基準元素,右邊全部大於基準元素,並返回獲取分割槽點下標 public static i...