快速排序
来源:互联网 发布: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
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- JavaScript函数绑定Demo以及函数Currying柯里化
- 学习Javascript闭包(Closure)
- Android开发——ListView局部刷新的实现
- javaSE_07Java中类和对象-封装特性--练习
- 基于贪心算法的区间问题
- 快速排序
- SplayTree--BZOJ1500
- malloc(0)会发生什么?
- JMeter自动生成测试Report
- 图像边缘检测、角点特征检测——2017.4.1
- 算法学习笔记--背包、队列、栈(1)
- springboot redis
- 城市问题(dijkstar)
- Hadoop、Zookeeper、Hbase集群安装配置过程及常见问题(一)准备工作