快速排序
思想:
以low指向的数据为基准,把high位置所指向的数据与基准进行比较,如果比基准大,high继续向前移动,如果比基准小,就把high指向的数据挪动到low位置,再从low位置开始移动,如果比基准小,low继续向后移动,当low指向的数据比基准大于基准,就把low指向的数据挪动到high的位置,又重新从high位置开始进行比较,high和low进行交替比较,直到low=high则结束
实现代码:
快排的递归实现
int Partition(int * arr,int low,int high) //一次划分
{
int tmp = arr[low];
while(low < high)
{
while(low < high && arr[high] >= tmp)
{
high --; //移动high
}
if(low == high)
{
break;
}
else
{
arr[low] = arr[high];
}
while(low < high && arr[low] <= tmp)
{
low ++; //移动low
}
if(low == high)
{
break;
}
else
{
arr[high] = arr[low];
}
}
arr[low] = tmp;
return low;
}
void Quick(int * arr,int low,int high) //通过递归方式多次划分使数组有序
{
int par = Partition(arr,low,high);
if(low + 1 < par)
{
Quick(arr,low,par-1); //low+1<par,说明了在划分位置的左边至少还有两个数据需要排序
}
if(high - 1 > par)
{
Quick(arr,par+1,high);
}
}
void Quick_sort(int * arr,int len)
{
Quick(arr,0,len-1);
}
快排的非递归
//快排的非递归使用栈进行排序
void Quick_sort(int *arr,int len)
{
int size = (int)(log10((double)len))/(log10((double)2));
int *stack = (int *)malloc(size*sizeof(int)*2);
int top = 0;
int low = 0;
int high = len - 1;
int par = patition(arr,low,high);
if(low + 1 < par)
{ //把low、high的数据压入栈
stack[top++] = low;
stack[top++] = par - 1;
}
if(high - 1 > par)
{
stack[top++] = par + 1;
stack[top++] = high;
}
while(top > 0)
{
high = stack[top--]; //出栈
low = stack[top--];
par = patition(arr,low,high);
if(low + 1 < par)
{
stack[top++] = low;
stack[top++] = par - 1;
}
if(high - 1 > par)
{
stack[top++] = par + 1;
stack[top++] = high;
}
}
}