排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。
对文件(File)进行排序有重要的意义。如果文件按key有序,可对其折半查找,使查找效率提高;在数据库( DataBase)和知识库(Knowledge Base)等系统中,一般要建立若干索引文件,就牵涉到排序问题:在一些计算机的应用系统中,要按不同的数据段作出若干统计,也涉及到排序。排序效率的高低,直接影响到计算机的工作效率。
这里介绍快速排序的基本思想
(1)将序列中的第一个数据作为基准。比基准小的数放在左半边,比基准大的数放在右半
边
(2)左边是比基准小的一组子集序列,继续使用同样的方法,进行排序;递归
(3)右边是比基准大的一组子集序列,继续使用同样的方法,进行排序,递归(递归指调用自身函数);
举个例子:
![](https://i-blog.csdnimg.cn/blog_migrate/e7d0c44b1cfa33b3e10894a31b1e0ecd.png)
调用递归思想
void quickSort(int a[],int low,int high)
{
int pivotkey;//当i==j;枢纽位置的下标;
if(low < high)
{
pivotkey = Partition(a,low,high);//得到当前的枢纽下标
quickSort(a,low,pivotkey-1);//对小于基准数据序列的左子集使用递归
quickSort(a,pivotkey+1,high);//对大于基准数据序列的右子集使用递归
}
}
实现快速排序
int Partition(int a[], int i,int j)
{
int tmp;
tmp = a[j];//选择左边的下标为0的值作为基准
while(1)
{
while(i < j)
{
if(a[i] > tmp)break;
i++;
}
a[j] = a[i];
while(i < j)
{
if(a[j] < tmp)break;
j--;
}
a[i] = a[j];
if(i==j) break;
}
a[i] = tmp;//i==j
return i;//返回枢纽的下标
}
实现快速排序代码:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
//函数功能:依据一个关键字基准,对数据继续排序,左边的数据比基准小,右边比基准大
//返回值:枢纽下标
int Partition(int a[], int i,int j)
{
int tmp;
tmp = a[j];//选择左边的下标为0的值作为基准
while(1)
{
while(i < j)
{
if(a[i] > tmp)break;
i++;
}
a[j] = a[i];
while(i < j)
{
if(a[j] < tmp)break;
j--;
}
a[i] = a[j];
if(i==j) break;
}
a[i] = tmp;//i==j
return i;//返回枢纽的下标
}
void quickSort(int a[],int low,int high)
{
int pivotkey;//当i==j;枢纽位置的下标;
if(low < high)
{
pivotkey = Partition(a,low,high);//得到当前的枢纽下标
quickSort(a,low,pivotkey-1);//对小于基准数据序列的左子集使用递归
quickSort(a,pivotkey+1,high);//对大于基准数据序列的右子集使用递归
}
}
int main(void)
{
int a[10];
int i;
printf("please input data:\n");
for( i = 0; i<10;i++)
{
scanf("%d",&a[i]);
}
for( i = 0;i < 10; i++)
{
printf("%5d",a[i]);
}
printf("\n");
quickSort(a,0,9);//i = 0,j =9;
for(i = 0; i < 10;i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}