快速排序

来源:互联网 发布:linux关闭oracle服务 编辑:程序博客网 时间:2024/06/12 01:25

一、思想

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

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

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