快速排序
2016-01-29 16:04
302 查看
C++
#include <iostream> using namespace std; void Qsort(int a[], int low, int high) { if(low >= high) { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ while(first < last) { while(first < last && a[last] >= key) { --last; } a[first] = a[last];/*将比第一个小的移到低端*/ while(first < last && a[first] <= key) { ++first; } a[last] = a[first]; /*将比第一个大的移到高端*/ } a[first] = key;/*枢轴记录到位*/ Qsort(a, low, first-1); Qsort(a, first+1, high); } int main() { int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24}; Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/ for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { cout << a[i] << ""; } return 0; }/*参考数据结构p274(清华大学出版社,严蔚敏)*/
C语言版本
void sort(int *a, int left, int right) { if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/ { return ; } int i = left; int j = right; int key = a[left]; while(i < j) /*控制在当组内寻找一遍*/ { while(i < j && key <= a[j]) /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升 序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ { j--;/*向前寻找*/ } a[i] = a[j]; /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是 a[left],那么就是给key)*/ while(i < j && key >= a[i]) /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反, 因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/ { i++; } a[j] = a[i]; } a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/ sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/ sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/ /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
Java
class Quick { public void sort(int arr[],int low,int high) { int l=low; int h=high; int povit=arr[low]; while(l<h) { while(l<h&&arr[h]>=povit) h--; if(l<h){ int temp=arr[h]; arr[h]=arr[l]; arr[l]=temp; l++; } while(l<h&&arr[l]<=povit) l++; if(l<h){ int temp=arr[h]; arr[h]=arr[l]; arr[l]=temp; h--; } } print(arr); System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n"); if(l>low)sort(arr,low,l-1); if(h<high)sort(arr,l+1,high); } } /*//////////////////////////方式二////////////////////////////////*/ 更高效点的代码: public<TextendsComparable<?superT>> T[]quickSort(T[]targetArr,intstart,intend) { inti=start+1,j=end; Tkey=targetArr[start]; SortUtil<T>sUtil=newSortUtil<T>(); if(start>=end)return(targetArr); /*从i++和j--两个方向搜索不满足条件的值并交换 * *条件为:i++方向小于key,j--方向大于key */ while(true) { while(targetArr[j].compareTo(key)>0)j--; while(targetArr[i].compareTo(key)<0&&i<j)i++; if(i>=j)break; sUtil.swap(targetArr,i,j); if(targetArr[i]==key) { j--; }else{ i++; } } /*关键数据放到‘中间’*/ sUtil.swap(targetArr,start,j); if(start<i-1) { this.quickSort(targetArr,start,i-1); } if(j+1<end) { this.quickSort(targetArr,j+1,end); } returntargetArr; } /*//////////////方式三:减少交换次数,提高效率/////////////////////*/ private<TextendsComparable<?superT>> voidquickSort(T[]targetArr,intstart,intend) { inti=start,j=end; Tkey=targetArr[start]; while(i<j) { /*按j--方向遍历目标数组,直到比key小的值为止*/ while(j>i&&targetArr[j].compareTo(key)>=0) { j--; } if(i<j) { /*targetArr[i]已经保存在key中,可将后面的数填入*/ targetArr[i]=targetArr[j]; i++; } /*按i++方向遍历目标数组,直到比key大的值为止*/ while(i<j&&targetArr[i].compareTo(key)<=0) /*此处一定要小于等于零,假设数组之内有一亿个1,0交替出现的话,而key的值又恰巧是1的话,那么这个小于等于的作用就会使下面的if语句少执行一亿次。*/ { i++; } if(i<j) { /*targetArr[j]已保存在targetArr[i]中,可将前面的值填入*/ targetArr[j]=targetArr[i]; j--; } } /*此时i==j*/ targetArr[i]=key; /*递归调用,把key前面的完成排序*/ this.quickSort(targetArr,start,i-1); /*递归调用,把key后面的完成排序*/ this.quickSort(targetArr,j+1,end); }
相关文章推荐
- volatile 保证变量内存中值的同步
- cocos2dx 3.x win7+VS2012开发环境搭建及HelloWorld
- linux下搭建vsftp,并使自动作业上传文件到ftp
- phpcms后台登录验证码删除
- Android自定义属性时TypedArray的使用方法
- 读《大数据》的三重大思维转变,有感
- swift语法知识(类结构体,构造函数,值和引用)
- python之浅拷贝深拷贝
- MySQL Split String Function
- weblogic集群负载分发模块mod_wl_22.so参数说明
- 在centos7/ubuntu15.04 上通过bosh-lite 搭建单机环境Cloud Foundry
- Serivce通知Activity更新UI方法总结
- MySQL字段名与保留字冲突
- CMake/CPack变量之CPACK_SET_DESTDIR
- swift 函数特性
- 结束终端
- Swift 传值之通知传值
- oracle数据库 kill一个session
- android studio内存分析初探
- Arch