基本思想:快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。举例来说:
数列:5,2,4,9,3,8,7,1,6,0
①选一个基准,此处以第一位5位基准,然后将5与各个数相比较,比5大的数放在5的右边(注意,此时右边的数并不是一组有序的数,仅仅比5大而已),比5小的数放在5的左边(与上相似)
②使用递归算法,将5左边的数与右边的数分别单独看成一组新的数列,再执行①的步骤思想;直至结束。
我的排序思想便是如此,但具体的执行,还需考虑:
根据①的思想衍生出代码思路,先从右边遍历,再从左边遍历,即代码中的while循环。再根据②的思想分割数列递归运算,直到排序完成。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*快速排序*/
void quicksort(int *ttr,int left,int right)
{
int i,j,temp,k;
if(left > right)
{
return;
}
temp = ttr[left];//先记录下 基准数,以便最后归位
i = left;
j = right;
while(i!=j)
{
while(ttr[j] >= temp && i<j)//从右向左依次查找
{
j--;
}
while(ttr[i] <= temp && i<j)//从左向右依次查找
{
i++;
}
if(i < j) //如果符合条件,交换两数的位置,
{
k = ttr[i];
ttr[i] = ttr[j];
ttr[j] = k;
}
}
ttr[left] = ttr[i];
ttr[i] = temp;
quicksort(ttr,left,i-1);
quicksort(ttr,i+1,right);
}
//测试函数
int main()
{
int str1[10] = {5,2,4,9,3,8,7,1,6,0};
int integer,i;
integer = sizeof(str1) / sizeof(int);
quicksort(str1,0,integer-1);
for(i = 0;i < integer;i++)
{
printf("%d\t",str1[i]);
}
printf("\n");
system("pause");
return 0;
}