最近在看剑指offer,有几道题惹我无限遐想,快排真是个神奇的算法。特来总结以下几道题。先来回忆快排排序,相信很多人已经很熟悉了。
快速排序的基本思想是:选定一个初始值对数组进行划分,左边数组都小于初始值右边都答大于初始值。然后继续对左右子数组继续划分,已达到整体对数组排序的目的。
我们先来实现对数组 的划分:目的很简单选定一个中间值,左右划分,,返回枢纽值下标。代码如下。
int partition(data*data,int low,int high)
{
int pivotkey=data[0];
while(low<high)
{
while(low<high&&data[high]>=pivotkey)
high--;
swap(data,low,high);
while(low<high&&data[low]<=pivotkey)
low++;
swap(data,low,high);
}
return low;
}
算法思想很简单,low,high分别指向数组的起点和终点,如果high定位的值比pivotkey大 high指针前移,直到出现不满足条件的值,此时交换 low和high 定位的值。同理low指针也同样的步骤 。直到low==high,此时结束循环 返回 low的下标或high的下标。
下边得出快速排序的递归算法。
void qsort(data*data,int low,int high)
{
int pivot;
if(low