快速排序
快速排序
1. 找一个基准值,值左边的数比它大,右边的数比它小
2. 然后对基准值左边的数进行递归排序,对基准值右边的数进行递归排序
#include<stdio.h>
void quick_sort(int *a,int start,int end)
{
if(start >= end) //递归结束条件;当start>=end说明一次排序已经完成,准备进行下一次排序
return ;
int i = start,j=end;
int temp = a[start]; //取基准值
while(i<j)
{
while(temp < a[j]) //j从右到左遍历,右边的数应该比基准值大,碰到的第一个比基准值小的数停止遍历,此时a[j]的值不变,需要比基准值大的数来填补空缺
j--; //此时数值下标为j
if(i<j)
{
a[i] = a[j]; //a[j]覆盖a[i],基准值右边的数比基准值大,左边的数比基准值小,
i++; //i从左到右遍历,基准值位置的数发生变化,找到比基准值大的数填补a[j]的空缺
}
while(temp > a[i] && i<j) //当a[i]比基准值小时,i向右移动
i++; //循环结束的条件是碰到a[i]>基准值
if(i<j)
{
a[j] = a[i];
j--;
}
}
a[i] = temp; //因为基准之被覆盖了,此时获取基准值,第一次循环结束,基准值左边的数比基准值小,右边的数应该比基准值大
quick_sort(a,start,i-1); //对基准值左边的数进行递归排序
quick_sort(a,i+1,end); //对基准之右边的数进行递归排序
return ;
}
int main(int argc, const char *argv[])
{
int a[] = {4,2,1,0,5,8,9,6,3,7};
int num = sizeof(a)/sizeof(int); //获取数组a元素个数
quick_sort(a,0,num-1); //数组元素下标是0——n-1
int i;
for(i=0;i<num;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
void quick_sort(int *a,int start,int end)
{
if(start >= end) //递归结束条件;当start>=end说明一次排序已经完成,准备进行下一次排序
return ;
int i = start,j=end;
int temp = a[start]; //取基准值
while(i<j)
{
while(temp < a[j]) //j从右到左遍历,右边的数应该比基准值大,碰到的第一个比基准值小的数停止遍历,此时a[j]的值不变,需要比基准值大的数来填补空缺
j--; //此时数值下标为j
if(i<j)
{
a[i] = a[j]; //a[j]覆盖a[i],基准值右边的数比基准值大,左边的数比基准值小,
i++; //i从左到右遍历,基准值位置的数发生变化,找到比基准值大的数填补a[j]的空缺
}
while(temp > a[i] && i<j) //当a[i]比基准值小时,i向右移动
i++; //循环结束的条件是碰到a[i]>基准值
if(i<j)
{
a[j] = a[i];
j--;
}
}
a[i] = temp; //因为基准之被覆盖了,此时获取基准值,第一次循环结束,基准值左边的数比基准值小,右边的数应该比基准值大
quick_sort(a,start,i-1); //对基准值左边的数进行递归排序
quick_sort(a,i+1,end); //对基准之右边的数进行递归排序
return ;
}
int main(int argc, const char *argv[])
{
int a[] = {4,2,1,0,5,8,9,6,3,7};
int num = sizeof(a)/sizeof(int); //获取数组a元素个数
quick_sort(a,0,num-1); //数组元素下标是0——n-1
int i;
for(i=0;i<num;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}