首先,要對快速排序的原理有一定的了解,先看C語言快速排序的代碼。
void sort(int a[],int size) { int i=0,j=size-1,value=a[0]; if(size>1) { while(ivalue) { a[j]=a[i]; break; } } } a[i]=value; sort(a,i); sort(&a[i+1],size-i-1); } }
while(ivalue) { a[j]=a[i]; break; } } }
把6(也就是a[0]的值)當作對比值,當執行第一次循環體的時候:
(第一個for循環)從右向左找比6小的,初始值中6 9 7 3 4,可以發現4比6小,於是把4賦給a[0],或許有的朋友會疑惑,a[0]的值那不就被覆蓋了麼,其實剛開始6已經賦值給value了,大家根據代碼也可以發現。 於是原來的值等於4的位置,也就是a[4](上圖第三行的黃底顯示),這就是一個“坑位”,裡面好像是保存了數據,但是這個數據沒用,因為它的值已經保存到了a[0](原a[0]的值保存到了value)。此時數組的元素為 4 9 7 3 4
(第二個for循環)從左向右找比6大的,根據上一個執行結果數組的元素改變為 4 9 7 3 4,9比6大,就是把9裝到上面那個坑位中。這個9原來所在的地方,也就是a[1]於是空了出來(盡管它裡面有個沒用的數據),成為坑位。
循環體執行一次成功。
接下來執行,第二次循環。到最後,最後的坑位是a[2]。
這個while循環體,執行完之後,i就會等於j。這個地方值得大家注意一下。而且i==2,剛好是坑位所在的位置。當執行完循環體後,a[2]=value;
發現沒,此時數組元素 4 3 6 7 9,以6為分節點,這個循環成功的完成他的任務。
接下來就是把4 3 看作新數組,7 9看作新數組。接著遞歸下去,直到這樣分割到只剩一個元素為止。
小學生能力有限,請大神幫忙斧正。