您的位置:首页 > 编程语言 > C语言/C++

快速排序

2017-04-07 21:46 302 查看

一、思想

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

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

※基本思想:①在待排序的序列中选择一个记录作为主元(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;
}

四、程序测试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序 c语言