快速排列
快速排列
算法简介
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
习题链接
算法实现步骤
-
找到一个基准数。
-
将数组里的数字大于基准数的放到基准数的右边,小于基准数的放到基准数的左边(本题是以升序排列,如果降序排列则相反)
-
排序完成后,使用递归重复1步骤和2步骤,最后找一个出口终止循环。
伪代码示范
#include<stdio.h>
int main()
{
读取你要输入几个数字
找到基准数
对数组进行排序
再找一个基准数继续排序
给出递归出口
输出结果
}
难点详解
怎么找到初始基准数
初始基准数一般默认为数组的第一个数字或者最后一个数字。
其实随便哪个数都行,全凭读者意愿。
如何将数组排序
设定基准数后设置一个判断条件为真则不动,为假则交换位置。
代码示例:
while(first < last)//此条件为排序是否完成的标志
{
while(first < last && arr[last] > key)
{
last--;
}
arr[first] = arr[last];//交换以升序排列
while(first < last && arr[first] < key)
{
first++;
}
arr[last] = arr[first];//交换以升序排列
}
排序完成后如何再找出基准数
排序完成后将排序结束的那个点的数组下标设置为基准数
代码示例:
arr[first] = key;
如何递归
每次递归都使两个数组下标相互逼近
代码示例:
QuickSort(arr, low, first-1);
QuickSort(arr, first+1, high);
递归出口
找到一个能完成排列的条件。
代码示例:
if(low >= high)
return;
源代码
void QuickSort(int arr[], int low, int high);
void Read(int n,int a[]);
void Put(int n,int a[]);
int main(void)
{
int i,n,a[10];
printf("How many Numbers dou you want to enter:\n");
scanf("%d",&n);
printf("Please enter n Numbers that you want to enter:\n");
Read(n,a);
QuickSort(a, 0, (n-1));
printf("In ascending order,the result is:\n");
Put(n,a);
return 0;
}
void QuickSort(int arr[], int low, int high)
{
int first = low;//数组第一个下标
int last = high;//数组最后一个下标
int key = arr[first];//就将数组第一位的值作为特征值
if(low >= high)//返回条件,因函数使用了递归
return;
while(first < last)
{
while(first < last && arr[last] > key)
{
last--;
}
arr[first] = arr[last];//交换以升序排列
while(first < last && arr[first] < key)
{
first++;
}
arr[last] = arr[first];//交换以升序排列
}
arr[first] = key;
QuickSort(arr, low, first-1);
QuickSort(arr, first+1, high);
}
void Read(int n,int a[])
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
}
void Put(int n,int a[])
{
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
运行结果


浙公网安备 33010602011771号