關於自製交換函式時的問題

2021-07-16 12:27:39 字數 1142 閱讀 7540

最近閒來無事,自己練習實現c語言快速排序,**如下:

#includevoid show(int*arr, int length)//顯示排序結果

printf("\n");

}void swap(int* a, int* b)//交換兩個值

void quick(int* arr, int ileft, int iright)

} swap(&arr[ileft],&arr[i]);

quick(arr,ileft,i);

quick(arr,i+1,iright); }}

int main(void)

; quick(a,0,9);

show(a,10);

getchar();

return 0;

}

大致看了下,沒發現什麼bug,但結果卻顯示

到底是什麼問題?

最後分步除錯了後才明白,是自己實現的交換函式swap出了問題

關於交換函式,我相信只要不是剛開始學的朋友都會注意到函式的副本問題,但此處卻不是這個問題,而是swap函式的實現方式上的問題

我們知道要交換兩個數有三種方式:借助第三方變數,上面中提到的相互加減法、位運算,當然,還有其它的方法歡迎補充。平時沒細研究這幾種方法的差別與侷限,一直想當然認為隨便哪種方法實現的效果都一樣,結果卻是否的。當我將swap函式通過第三方變數的形式實現了之後,結果為:

此時結果卻正確了,原來是之前採取的互相加減法的方式出了問題,並不是方法本身,而是它的使用地方。

在排序的過程中,程式有可能出現自己和自己交換的情況,當這種情況發生時,(比如*a=7,*b=7)  *a=*a+*b 此時*a=14,因為是同乙個數,*b也等於14。第二行*b=*a-*b,就在這個位置,*b=0了,因此*a也就等於0了,問題就出在這裡!不僅在這種情況下容易出問題,比如交換的是兩個字元,因為char型別的範圍限值,很可能導致溢位問題,朋友們應該注意!

本人也算乙個初學者,如果有什麼問題或補充還望高手們不吝賜教!

關於交換函式的指標內容

首先讓我們來寫乙個簡單的交換函式 void swap int a,int b int tmp a a b b tmp printf d,d n a,b int main int a 10 int b 20 printf d,d n a,b swap a,b return 0 執行以上程式,我們會得到...

線路交換和分組交換的時延

試在下列條件下比線路交換和分組交換。要傳送的報文共x bit 從源站到目的站共經過k段鏈路,每段鏈路的傳播時延為d s 資料率為c bit s 在電路交換時電路的建立時間為s s 在分組交換時分組長度為p bit 且各結點的排隊等待時間可忽略不計。問在怎樣的條件下,分組交換的時延比電路交換的要小?答...

關於使用pip時,遇到的問題

問題描述 當我使用pip install 需要的安裝包時,其會報如下錯誤 insecureplatformwarning could not fetch url there was a problem confirming the ssl certificate httpsconnectionpoo...