排序六之快速排序
2016-02-03 16:08
162 查看
Quick Sort
一种类似于冒泡排序的排序算法;并对冒泡排序进行了改进,基于交换排序思想。
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
1:首先设定一个分界值,通过该分界值将数组分成左右两个部分。
2:将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数据的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值。
3:然后,左边和右边的数据可以独立排序。对于左侧的数组数据,,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧数据也可以做类似处理。
4:重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的数据。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
一种类似于冒泡排序的排序算法;并对冒泡排序进行了改进,基于交换排序思想。
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
1:首先设定一个分界值,通过该分界值将数组分成左右两个部分。
2:将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数据的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值。
3:然后,左边和右边的数据可以独立排序。对于左侧的数组数据,,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧数据也可以做类似处理。
4:重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的数据。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
#include<stdio.h> #include<stdlib.h> #include<time.h> #define SIZE 10 void QuickSort(int *a,int l,int r) { int temp; int i=l,j=r; if(l<r) { temp=a[l]; while(i!=j) { while(j>i&&a[j]>temp) --j; if(i<j) { a[i]=a[j]; ++i; } while(i<j&&a[i]<temp) ++i; if(i<j) { a[j]=a[i]; --j; } } a[i]=temp; QuickSort(a,l,i-1); QuickSort(a,i+1,r); } } int main() { int i; int shuzu[SIZE]; srand(time(NULL)); for(i=0;i<SIZE;i++) shuzu[i]=rand()/1000+100; printf("排序前的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); QuickSort(shuzu,0,SIZE-1); printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); return 0; }
相关文章推荐
- AsyncTask异步下载图片
- (5)基本工作流(打包与运行环境配置)
- 如何提高自己的iOS开发水平(转自唐巧的博客)
- GraphX迭代的瓶颈与分析
- Linux 使用wget 命令下载JDK的方法
- Android ViewTreeObserver 简介
- asp.net(C#)之NPOI"操作Excel
- ZZ指令重排序
- InnoDB Adaptive hash index介绍
- 创建一个utf8编码的数据库
- Android 特殊的单例Toast(防止重复显示)
- Spark Vector 解释
- mysql操作
- 【POJ】3415 Common Substrings
- 物体识别重要指标——平均准确率(Average Precision, AP )
- 如何处理SecureFX工具中的中文乱码
- Linux每日学习(十五)
- InnoDB Fulltext简介
- spring事务管理几种方式(转)
- 188 Best Time to Buy and Sell Stock IV