快速排序法

  快速排序算法

 

问题描述:   

 /* 快速排序由C•A•R•Hoare在1962年提出,是对冒泡排序的改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的都小;然后再按此方法,对这两部分数据分别进行快速排序,整个排序过程可以递归进行,直到整个数据变成有序序列为止。相比于冒泡排序,快速排序在时间性能上有大大的提升。
       本案例要求使用指针实现快速排序算法,并将排序结果逐个输出。*/


思路分析:

 

设排序的数组为S[0]...S[n],首先任意选取一个关键数据,将数组分为两部分,一部分全部大于关键数据,另一部分全部都大于关键数据,一趟排序的步骤如下:

  1. 定义变量low,high,并使得low=0,high=n-1;
  2. 任意选取一个关键数据,(一般为数组首个数据,即key=*(low),
  3. high从右边到左边逐个检查,找到第一个小于key的数字,将s[low]和s[high]交换;
  4. low从左边到右边逐个检查,找到第一个大于key的数字,将s[low]和s[high]交换;
  5. 当low>=high,第一趟排序结束,递归调用函数对被分割的两个数据块再次进行快速排序;

代码明细:

 

#include<stdio.h>
#include<stdlib.h>
void quicksort(int *arr,int left,int right)  //快速排序函数
{
	int l,j,key;              //定义关键数据;
if(left>=right)                  //如果left大于或等于right,排序结束;
return;
 l=left;
 j=right;
 key=*(arr+left);                 //将队首设为关键数据;
while(l<j)               
{
	while(l<j&&key<=arr[j])//如果满足left<right并且s[right<key]交换s[left]和s[right];
		j--;
	int temp=arr[j];
	arr[j]=arr[l];
	arr[l]=temp;
	while(l<j&&key>=arr[l])如果满足left<right并且s[left>key],交换s[left]和s[right];
		l++;
	temp=arr[l];
	arr[l]=arr[j];
	arr[j]=temp;
}
quicksort(arr,left,key-1);      //递归调用排序函数对小于关键值的数据段进行排序;
quicksort(arr,key+1,right);        //递归调用排序函数对大于关键值的数据段进行排序;

}

void print(int *arr,int n)      //输出函数
{
	int l;
	for(l=0;l<n;l++)
		printf("%d   ",*(arr+l));
}

void scan(int *arr,int n)        //输入函数
{
	for(int i=0;i<n;i++)
	scanf("%d",&(*(arr+i)));
	
}


int main()
{
	int arr[10] ;//={3,5,6,7,2,8,9,1,0,4};
	printf("请输入十个数\n");
	scan(arr,10);
	printf("原数组\n");
print(arr,10);
printf("\n");
printf("修改后\n");
quicksort(arr,0,9);
print(arr,10);
printf("\n");
return 0;
}

 

 

 

 

 

 

 

运行结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值