实现快速排序

排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。

对文件(File)进行排序有重要的意义。如果文件按key有序,可对其折半查找,使查找效率提高;在数据库( DataBase)和知识库(Knowledge Base)等系统中,一般要建立若干索引文件,就牵涉到排序问题:在一些计算机的应用系统中,要按不同的数据段作出若干统计,也涉及到排序。排序效率的高低,直接影响到计算机的工作效率。

这里介绍快速排序的基本思想

(1)将序列中的第一个数据作为基准。比基准小的数放在左半边,比基准大的数放在右半
(2)左边是比基准小的一组子集序列,继续使用同样的方法,进行排序;递归
(3)右边是比基准大的一组子集序列,继续使用同样的方法,进行排序,递归(递归指调用自身函数);
举个例子:

调用递归思想

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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值