#include<stdio.h>
#define NUM 10
int data[NUM];
/***
* 分区
* 子表 递归分区
***/
int partition(int *data,int low,int high)
{
int pivot = data[low];//base
while(low < high)
{
while (low < high && data[high] >= pivot)//最后边的数值大于base,则数值位置不动,high--,遍历下一个右边的数值
{
/* code */
high--;
}
//遇到右边的值小于base,则开始分:右边的值放在base的位置
data[low] = data[high];
//low空间已经被值写入了,开始右移动low;找大于base的值,找到后放到high位置
//为什么前面从右边遍历,现在又从左边遍历:因为左边的位置满了,high的位置被空出,需要填high位置
while(low < high && data[low] <= pivot)
{
low++;
}
data[high] = data[low];
}
//上面函数的目的:就是找符合小的值在左,大的值在右的:low(high)值
//low = high
data[low] = pivot;
int base;
base = low;
return base;
}
void quick_sort(int *data,int low,int high)
{
printf("start to sort\n");
if(low < high)
{
//找分离点,分离点空间为base值,左右子表递归quick_sort
int pivotpos = partition(data,low,high);
quick_sort(data,low,pivotpos-1);
// pivotpos指向的值不排序
quick_sort(data,pivotpos+1,high);
}
}
void display(int *data,int len)
{
int i;
printf("data is :");
for(i = 0;i<len;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}
int main(int argc,int *argv[])
{
printf("input 10 num:\n");
int i;
for(i=0;i<NUM;i++)
{
scanf("%d",&data[i]);
}
display(data,NUM);
//sort
quick_sort(data,0,NUM-1);
display(data,NUM);
return 0;
}