最近閒來無事,自己練習實現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...