剑指offer——快速排序
2016-03-06 15:45
281 查看
快速排序是目前所有排序中性能较好的一种算法,最好情况和平均情况下时间复杂度均为O(nlogn),最坏的情况下时间复杂度为O(n^2)。快速排序采用递归,用空间换取时间。由于使用了递归,因此需要额外的存储空间。
快速排序由三个函数构成,分别为QuickSort(int[] arr)、QuickSort(int[] arr,int start,int end)、partition(int[] arr,int start,int end)。其中partition函数能够从当前待排序序列中找出一个主元,并使得主元左侧的元素均小于主元,主元右侧的元素均大于主元。Partition函数完成对待排序序列的分割后,交给QuickSort(int[]
arr,int start,int end)处理,QuickSort分别将被Partition分隔的两个子序列进行快速排序。QuickSort(int[] arr)是整个快速排序的入口函数,用户只需传入待排序数组即可。
下面为java实现的快速排序,若有bug欢迎拍版
快速排序由三个函数构成,分别为QuickSort(int[] arr)、QuickSort(int[] arr,int start,int end)、partition(int[] arr,int start,int end)。其中partition函数能够从当前待排序序列中找出一个主元,并使得主元左侧的元素均小于主元,主元右侧的元素均大于主元。Partition函数完成对待排序序列的分割后,交给QuickSort(int[]
arr,int start,int end)处理,QuickSort分别将被Partition分隔的两个子序列进行快速排序。QuickSort(int[] arr)是整个快速排序的入口函数,用户只需传入待排序数组即可。
下面为java实现的快速排序,若有bug欢迎拍版
/** * 实现快速排序 * @author chibozhou */ public class QuickSort { /** * 本函数实现一趟快速排序,以数组的第一个元素为主元, * 本函数运行结束后使得主元左侧的元素小于主元,主元右侧的元素大于主元。 * @param arr 待排序的数组 * @return 返回经一趟排序后主元的下标 */ private static int partition(int[] arr,int start,int end){ //健壮性判断 if(arr.length<=0){ System.out.println("数组为空!"); return -1; } if(start<0 || end<0 || start>end){ System.out.println("start、end非法!"); return -1; } //i指向数组头、j指向数组尾 int i=start+1,j=end; //选择数组第一位为主元 int key = arr[start]; //若i与j未相遇,则执行以下循环 while(i<j){ //i从左向右扫描,直到当前元素大于主元时停下 while(arr[i]<=key && i<end){ i++; } //j从右向左扫描,直到当前元素小于主元时停下 while(arr[j]>=key && j>start){ j--; } //i、j停下有两种情况:1. if(i<j) swap(arr,i,j); } //将主元与j交换 swap(arr,start,j); System.out.println("某一趟排序结果:"+printArray(arr)); //返回新的主元下标 return j; } /** * 快速排序入口函数 * @param arr 待排序数组 * @return 返回有序的数组 */ public static void QuickSort(int[] arr){ //健壮性判断 if(arr==null || arr.length<=0){ System.out.println("数组为空!"); return; } //通过递归进行快速排序 QuickSort(arr,0,arr.length-1); } /** * 快速排序的递归函数 * @param arr 待排序数组 * @param start 数组的起始下标 * @param end 数组的结束下标 * @return 返回当前有序子序列 */ private static void QuickSort(int[] arr,int start,int end){ if(start<end){ //获取主元 int key = partition(arr,start,end); //对主元左侧的序列进行快速排序 QuickSort(arr,start,key-1); //对主元右侧的序列进行快速排序 QuickSort(arr,key+1,end); } } /** * 实现i与j位置的元素交换 * @param arr 数组 * @param i 下标 * @param j 下标 */ private static void swap(int[] arr,int i,int j){ //健壮性判断 if(arr==null || arr.length<=0){ System.out.println("数组为空!"); return; } //定义临时变量temp实现交换 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /** * 输出数组元素 * @param arr * @return */ private static String printArray(int[] arr){ if(arr==null){ System.out.println("数组为空!"); return null; } StringBuffer sb = new StringBuffer(); for(int i=0;i<arr.length;i++){ sb.append(arr[i]); } return sb.toString(); } }
相关文章推荐
- HTML5编码规范(编写灵活,稳定,高质量的HTML)
- CSS(CS3)编码规范
- CSS3animation动画 + 动画如何切换
- JavaScript实现图片滑动切换的代码示例分享
- JS调用OC方法(JavaScriptCore)
- 201603061528_《Javascript交换两个变量值(不借用第三变量)》
- swiper H5 滑屏插件推荐
- threejs使用概述
- 201603061520_《Javascript生成随机字符串函数(可用于加密)》
- AngularJS 入门3
- AngularJS 入门2
- 使用jQuery或者原生js实现鼠标滚动加载页面新数据
- JavaScript加载XMl文件
- Qt 样式表 边界盒模型
- 使用jstack 发现死锁
- react封装二维码
- js 去掉字符串前后空格
- angularJS 入门1
- 初见html5
- 前端精选文摘:BFC 神奇背后的原理