快速排序算法
问题描述:
/* 快速排序由C•A•R•Hoare在1962年提出,是对冒泡排序的改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的都小;然后再按此方法,对这两部分数据分别进行快速排序,整个排序过程可以递归进行,直到整个数据变成有序序列为止。相比于冒泡排序,快速排序在时间性能上有大大的提升。
本案例要求使用指针实现快速排序算法,并将排序结果逐个输出。*/
思路分析:
设排序的数组为S[0]...S[n],首先任意选取一个关键数据,将数组分为两部分,一部分全部大于关键数据,另一部分全部都大于关键数据,一趟排序的步骤如下:
- 定义变量low,high,并使得low=0,high=n-1;
- 任意选取一个关键数据,(一般为数组首个数据,即key=*(low),
- high从右边到左边逐个检查,找到第一个小于key的数字,将s[low]和s[high]交换;
- low从左边到右边逐个检查,找到第一个大于key的数字,将s[low]和s[high]交换;
- 当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;
}
运行结果: