快速排序是采用了一种分治的策略,通常称其为分治法。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:
以一个数组作为示例,取区间第一个数为基准数。
void Swap(int *n, int *m){
int temp;
temp = *n;
*n = *m;
*m = temp;
}
int partion(int a[], int left, int right){
int i, j, t, temp;
temp = a[left]; //temp中存的就是基准数
i = left;
j = right + 1;
while (true)
{
while (a[++i] < temp&&i < right);//在左边找大于temp的数
while (a[--j]>temp);//在右边找小于temp的数
if (i >= j)//结束标志
break;
Swap(&a[i], &a[j]);
}
a[left] = a[j];
a[j] = temp;
return j;
}
void quicksort(int a[], int left, int right) {
if (left <right)
{
int q = partion(a, left, right);
quicksort(a, left, q - 1);//继续处理左边的,这里是一个递归的过程
quicksort(a, q + 1, right);//继续处理右边的 ,这里是一个递归的过程
}
}
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned int)time(NULL));
int a[100];
int i, n;
//读入数据
scanf_s("%d", &n);
for (i = 0; i < n; i++)
//scanf_s("%d", &a[i]);
a[i] = rand()%100;
quicksort(a, 0, n - 1); //快速排序调用
//输出排序后的结果
for (i = 0; i < n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}