快速排序法的原理我就不多講了,就是基於分冶的思想,所以一般用遞歸調用實現。至於具體原理網上一搜一大把,而我要講的就是代碼實現中具體代碼部分的講解。首先看第一種實現方式:
//快速排序第一種方式實現
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 從右向左找第一個小於x的數
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 從左向右找第一個大於等於x的數
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 遞歸調用
quick_sort(s, i + 1, r);
}
}
其實這種方法,在網上是講的最多的,而且很詳細,就是從兩端開始。i,j分別與比較量(一般是首個數或者中間量)進行比較,比它小的替換掉放一邊,比它大的放另外一邊。最後再把比較量放到分割位置。
在這裏我着重講第二種代碼實現方式:
//快速排序第二種實現方式
void qsort(int v[],int left,int right)
{
int i, last;
void swap(int v[],int i,int j);//交換兩個數
if(left >= right)
return;
swap(v,left,(left+right)/2);//將中間數交換,防止第一個數就是最小或者最大,減小複雜度
last=left;//第一個數爲比較量
for(i=left+1;i<=right;i++)
if(v[i]<v[left])
swap(v,++last,i);
swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}
可以發現,這種代碼實現方式比第一種簡潔的很多,但是不夠直觀,關鍵代碼如下:
last=left;//第一個數爲比較量
for(i=left+1;i<=right;i++)
if(v[i]<v[left])
swap(v,++last,i);
swap(v,left,last);
第二種方式的實現是從一端開始的,我們可以這麼想,比較量是第一個,即v[left]。後面的數v[i]都和它進行比較,i是個移動量,而last是一個在數組中做標記的,在標記的數後面的數都是比v[left]小的數,
每當v[i]小於v[left],last應該先+1,因爲它自身是滿足小於v[left],所以需要將前面不滿足的數替換掉,然後自己又指向了這個新的數,i也往後移一位。最後再將這個分割量v[left]交換到分割位置last。
這是對第二種實現方式代碼圖解方式[(http://www.cnblogs.com/kaituorensheng/archive/2013/02/23/2923771.html)]