快速排序----在无序的数组中,任意定义一个中间值称为pivot,一般情况下选择
mid number=(left+right)/2,然后和左端或者右端的值进行交换,然后再开始每一个元素与其比较。分别用数组的两个下标来来表达处理的进程,i是判断过大小的数,past是临时分界点,past左边都是比pivot小的数,右边在i不是最后一个数前,是不确定的。当i到达right也就是最后一个判断值之后,past的右边包括past就都是比pivot大的数。对于等于pivot的数不做判断,在左边或者右边没有影响。这时把pivot和past交换,这样pivot的左边都是比他小或等于它的,右边就是等于或大于他的。 在对左边进行排序,在对右边进行排序就可以了。
需要注意的是在用for 进行检查的时候i = 0是不对的,必须要i=left来确保判断区间的正确!!
#include <stdio.h>
#include <ctype.h>
void q_sort(int v[], int left, int right);
void swap(int v[], int i, int j);
int main(void)
{
int num[10] = {3,3,2,1,23,3,1,5,1,44};;
q_sort(num, 0, 9);
for(int i = 0 ; i < 10 ; i++)
printf("%d ",num[i]);
}
void q_sort(int v[], int left, int right)
{
//当子集里面只有一个值得时候,退出排序
if(left >= right)
{
return;
}
int i, pivot, last;
//把pivot中间比较值设定为最右边的值
pivot = right;
//指针指向一个初始不确定的值,如果有数比比较值小就和这个指向的值交换
last = left;
for(i = left ; i <= right ; i++)
if(v[i] < v[pivot])
swap(v, i, last++);
swap(v, pivot, last);
//中间值左边继续排序
q_sort(v, left, last-1);
//中间值右边继续排序
q_sort(v, last+1, right);
}
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}