快速排序

时间复杂度:O(n*logn)
定义:
在一组无序的数列中,指定一个数为基准值,遍历数列,将比其小的放在左边,比其大的放在右边。这样基准值所在位置即为排序后的最终位置,保持不动。再将基准值左右的数组进行递归。,直到中间只有一个数结束。

方法一:

覆盖法:将第一个元素当成基准值,存储起来。I和J分别指向数组的首位。从后面向前找到比基准值小的数,将I所指的值覆盖,I再向后找比基准值大的数,覆盖J所指的数。当I和J重合时,将基准值覆盖,完成一次循环。

#include<stdio.h>

void quick(int a[],int low,int high)
{
	if(low >= high)
		return;
	int i = low;
	int j = high;
	int tmp = a[low];
	while(i < j){
		while(i<j && a[j] >= tmp)
			j--;
		a[i] = a[j];
		while(i<j && a[i] <= tmp)
			i++;
		a[j] = a[i];
	}
	a[i]=tmp;
	quick(a,low,i-1);
	quick(a,i+1,high);
}




int main()
{
	int i=0;
	int a[9]={12,38,56,0,21,7,9,16,99};
	quick(a,0,8);
	for(i=0;i<9;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
return 0;}



方法二:

交换法:将第一个元素当成基准值,J指向第一个元素。I从第一个数开始遍历数组。碰到不大于基准值的数就和J所指的值进行交换,J前进一位。这样就会将所有比基准值小的数交换到左面。最后基准值再和J所指的前一个数进行交换,完成一次循环。

#include<stdio.h>


void quick(int* a,int low,int high)
{
	if(low>=high)
		return;
	int tmp=a[low];
	int swap=0;
	int i=0,j=0;
	for(i=low,j=low;i<=high;i++){
		if(a[i]<=tmp){
			swap=a[i];
			a[i]=a[j];
			a[j]=swap;
			j++;
		}
	}
	j--;
	swap=a[low];
	a[low]=a[j];
	a[j]=swap;
	quick(a,low,j-1);
	quick(a,j+1,high);
}








int main()
{
	int i=0;
	int a[9]={12,38,56,0,21,7,9,16,99};
	quick(a,0,8);
	for(i=0;i<9;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值