c语言实现快速排序
2015-09-08 11:01
253 查看
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。By the way,快速排序的时间复杂度为(nlogn).
下面为c语言代码:
有什么意见或者建议,读者可以给我说说,大家一块进步。Thanks.
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。By the way,快速排序的时间复杂度为(nlogn).
下面为c语言代码:
#include<stdio.h> #define MaxSize 100 struct DataType { int data; }; struct Sqlist { DataType R[MaxSize]; int length; }; //寻找基准的放入位置 int Partition(Sqlist *l,int left,int right) { l->R[0] = l->R[left];//置为哨点 while(left < right) { //从右向左开始查找第一个小于哨点的数 while(left<right && l->R[right].data >= l->R[0].data) { right--; } if(left<right) { //将较小数移至左边 l->R[left] = l->R[right]; left++; } //从左向右开始查找第一个大于哨点的数 while(left<right && l->R[left].data <= l->R[0].data) { left++; } if(left<right) { //将较大数移至右边 l->R[right] = l->R[left]; right--; } //测试或者便于理解使用代码 /* printf("\n查看该趟排序结果:\n"); for(int i=0;i<l->length;i++) { printf("%d ",l->R[i+1].data); } printf(" left=%d right=%d \n",left,right); */ } //将基准送至准确的位置(左边的数比它小,右边的数比它大) l->R[left] = l->R[0]; return left; } //快速排序 void QuickSort(Sqlist *l,int left,int right) { int position; if(left<right) { position = Partition(l,left,right); QuickSort(l,left,position-1); QuickSort(l,position+1,right); } } int main() { Sqlist list; list.length = 11; int data[11] = {3,1,9,2,4,7,5,6,2,3,1}; //初始化 for(int i=0;i<list.length;i++) { list.R[i+1].data = data[i]; } //Partition(&list,1,11); QuickSort(&list,1,11); for(int i=0;i<list.length;i++) { printf("%d ",list.R[i+1].data); } return 0; }运行结果:
有什么意见或者建议,读者可以给我说说,大家一块进步。Thanks.
相关文章推荐
- 减少C++代码编译时间的方法
- C语言函数调用模型[调用过程中在堆栈中的出栈、进栈顺序]
- C/C++快速入门图形化教学法简介(目录)
- libcurl在vs2013下C++项目中的编译连接
- C语言---函数返回局部变量
- C++获取系统时间
- VS工程中添加c/c++工程中外部头文件及库的基本步骤
- 《C++入门经典(第4版)》之C++编程总结
- POJ C++程序设计 编程题#1 编程作业—STL2
- 通过指针引用字符串
- c++学习笔记
- C++站点
- 【华为上机试题C++】老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
- 【转】c++编译原理
- c++对txt文件的读取与写入
- C++中的内联函数inline总结
- 讲解C++的do while循环和循环语句的嵌套使用方法
- c++ primer 学习笔记
- C++中的while循环和for循环语句学习教程
- c++のnamespace