看了关于快速排序的这篇文章之后,写个总结
快速排序的思想:
- 先从数列中取出一个数作为基准数。
- 分区过程:将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
算法分为两个部分:
- 挖坑填数
- 分而治之
挖坑填数:
- i=L,j=R;L代表序列左边,R代表序列右边,将基准数挖出形成第一个坑a[i],一般是从左边数第一个
- j--由后向前找比基准小的数,找到后挖出此数填在前一个坑a[i]中。
- i++由前向后找比基准大的数,找到后也挖出填在前一个坑a[j]中。
- 再重复执行2,3步骤,直到i==j,将基准数填入a[i]或者a[j]中。
挖坑的代码:
int AdjustArray(int s[], int L, int R) //返回调整后基准数的位置
{
int i = L, j = R;
int x = s[L]; //s[L]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && s[j] >= x)
j--;
if(i < j)
{
s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && s[i] < x)
i++;
if(i < j)
{
s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
return i;
}
再写分治法的代码:
void quick_sort1(int s[], int L, int R)
{
if (L < R)
{
int i = AdjustArray(s, L, R); //先成挖坑填数法调整s[]
quick_sort1(s, L, i - 1); // 递归调用
quick_sort1(s, i + 1, R);
}
}
代码整合,完整的快速排序算法:
//快速排序
void quick_sort(int s[], int L, int R)
{
if (L < R)
{
int i = L, j = R, x = s[L];
while (i < j)
{
while(i < j && s[j] >= x) j--; // 从右向左找第一个小于x的数
if(i < j) s[i++] = s[j];
while(i < j && s[i] < x) i++; // 从左向右找第一个大于等于x的数
if(i < j) s[j--] = s[i];
}
s[i] = x;
quick_sort(s, L, i - 1); // 递归调用
quick_sort(s, i + 1, R);
}
}