快速排序

一、思想

※快速排序是对冒泡排序的一种改进。

※快速排序使用分治的思想。

※基本思想:①在待排序的序列中选择一个记录作为主元(pivot);

     ②将所要排序的数分为左右两部分(左边部分都不大于主元,右边部分都不小于主元);

     ③然后将左半部分和右半部分进行同样的划分,重复执行以上的划分操作直至序列有序。

二、步骤详解

※快速排序程序=分划函数Partition+快速排序的递归函数QuickSort

【基本变量】

int arr[9]={72,26,57,88,42,80,73,48,60};
int left=0,right=8;
int pivot=arr[left];
int i=left,j=right;

【分划方法——Partition代码】

int Partition(int arr[],int left,int right)
{
	int i=left,j=right,temp;					//此处没降j赋值为right+1,因为while循环里严格控制了i和j,从而使它们不会越界
	int pivot=arr[left];					//设主元为数组第一个元素
	while(i<j){							//当i>=j时退出循环
		while(arr[i]<=pivot&&i<j){		     
			i++;
		}
		while(arr[j]>=pivot&&i<j){
			j--;
		}
		if(i<j){						//条件成立,则交换arr[i]和arr[j]
			temp=arr[i];arr[i]=arr[j];arr[j]=temp;
		}	
	}
	if(arr[i]<=arr[left]){					//此时,i==j;因为要主元左边的子序列都小于主元,故需作此选择
		temp=arr[i];arr[i]=arr[left];arr[left]=temp;	
		return i;
	}
	else{						
		temp=arr[i-1];arr[i-1]=arr[left];arr[left]=temp;
		return i-1;						//返回i-1,因为是arr[i-1]和arr[left]交换
	}
}


【分治思想——递归调用】

QuickSort代码

void QuickSort(int arr[],int left,int right)
{
	int k;
	if(left<right){					//当left>=right时,没必要排序
		k=Partition(arr,left,right);		//返回主元的下标值,其目的是将序列分为两个子序列并确定子序列的首尾元素下标值
		QuickSort(arr,left,k-1);		//对数组arr[0~k-1]进行分划
		QuickSort(arr,k+1,right);		//对数组arr[k+1~8]]进行分划
	}
}

三、C代码

#include<stdio.h>

int Partition(int arr[],int left,int right)
{
	int i=left,j=right,temp;
	int pivot=arr[left];
	while(i<j){
		while(arr[i]<=pivot&&i<j){
			i++;
		}
		while(arr[j]>=pivot&&i<j){
			j--;
		}
		if(i<j){
			temp=arr[i];arr[i]=arr[j];arr[j]=temp;
		}	
	}
	if(arr[i]<=arr[left]){
		temp=arr[i];arr[i]=arr[left];arr[left]=temp;	
		return i;
	}
	else{
		temp=arr[i-1];arr[i-1]=arr[left];arr[left]=temp;
		return i-1;
	}
}


void QuickSort(int arr[],int left,int right)
{
	int k;
	if(left<right){
		k=Partition(arr,left,right);
		QuickSort(arr,left,k-1);
		QuickSort(arr,k+1,right);
	}
}


int main()
{
	int arr[9]={72,26,57,88,42,80,73,48,60},i;
	printf("排序前:");
	for(i=0;i<8;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	QuickSort(arr,0,8);
	printf("排序后:");
	for(i=0;i<8;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;
}

四、程序测试





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值