交換演算法引起的快速排序錯誤

2022-08-23 12:45:11 字數 994 閱讀 7457

前兩天手寫快速排序,最後得到的結果是錯誤的而且還錯的非常奇怪。輸入的待排序陣列是:

int a[10] = ;

最後得到的結果是:

002

0006

080

上網看了看別人的**,發現我寫的快速排序的演算法邏輯是沒有錯誤的,難道是交換元素時用的演算法不對?

我用的交換演算法是異或交換,就是不用中間變數那種:

void swap( int *a, int *b )

然後將其換成使用中間變數的交換演算法:

void swap( int *a, int *b )

然後結果就對了,但是一直想不明白為什麼。最後通過在紙上演算一遍才恍然大悟。

例如我這個輸入:

2 

6 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...