排序算法 快速排序
2018-03-13 21:13
190 查看
转载自:http://blog.csdn.net/lemon_tree12138/article/details/50622744
1.基本思想:
分治思想,对冒泡排序改进。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.步骤:
1)获得待排序数组a
2)选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准
3)将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边
4)从第3步获得的两个子数组sub1跟sub2
5)判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行
3.复杂度分析:
如果我们在选取基准p的时候,每次选取的都是当前数组中最小的一个元素,那么每次划分都只是让数组中的元素少1(被筛选出来的那个元素当然有序),这样一来就需要反复遍历数组导致复杂度变成了O(n2)。
如果我们在选取基准p的时候,每次选取的都是当前数组中最中间的一个元素(是中位数,而不是元素位置上的中间),那么每次划分都把当前数组划分成了长度相等的两个子数组,这样一来复杂度变成了O(nlog2n)。
4.代码
91a5
1.基本思想:
分治思想,对冒泡排序改进。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.步骤:
1)获得待排序数组a
2)选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准
3)将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边
4)从第3步获得的两个子数组sub1跟sub2
5)判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行
3.复杂度分析:
如果我们在选取基准p的时候,每次选取的都是当前数组中最小的一个元素,那么每次划分都只是让数组中的元素少1(被筛选出来的那个元素当然有序),这样一来就需要反复遍历数组导致复杂度变成了O(n2)。
如果我们在选取基准p的时候,每次选取的都是当前数组中最中间的一个元素(是中位数,而不是元素位置上的中间),那么每次划分都把当前数组划分成了长度相等的两个子数组,这样一来复杂度变成了O(nlog2n)。
4.代码
//快速排序 //打印排序的序列 public static void quickSort(int[] arr){ sortCore(arr,0,arr.length-1); StringBuilder num=new StringBuilder(); for(int i:arr){ num.append(i+" "); } System.out.println(num.toString()); } //核心排序算法 public static void sortCore(int[] arr,int startIndex,int endIndex){ if(startIndex>=endIndex){ return; } int boundary=boundary(arr,startIndex,endIndex); sortCore(arr,startIndex,boundary); sortCore(arr,boundary+1,endIndex); } //左右两区部分数据 交换并返回分界点 private static int boundary(int[] arr, int start, int end) { int standard=arr[start];//定义标准,即最左元素 int leftIndex=start;//左指针 int rightIndex=end;//右指针 while(leftIndex<rightIndex){ while(leftIndex<rightIndex && arr[rightIndex]>=standard){ rightIndex--; //从右向左查找 } arr[leftIndex]=arr[rightIndex];//小于基准的移到左端 while(leftIndex<rightIndex && arr[leftIndex]<=standard){ leftIndex++;//从左往右查找 } arr[rightIndex]=arr[leftIndex];//大于基准的移到右端 } arr[leftIndex]=standard;//基准位置不再变化,基准值来到中间 return leftIndex; }
91a5
相关文章推荐
- 排序算法-快速排序
- Java排序算法(四):快速排序
- 基于分治策略的排序算法:合并排序和快速排序
- 排序算法(二):快速排序
- 排序算法之快速排序的C++实现
- 基本排序算法之3——快速排序quicksort
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法总结(6)——快速排序
- 排序算法之快速排序
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 排序算法——快速排序
- java算法(一)——排序算法(下)之 快速排序
- C语言常用的几种排序算法代码(选择排序,冒泡排序,插入排序,快速排序)
- Java技术栈(2)排序算法(冒泡,快速排序)
- 排序算法(3):冒泡排序与快速排序
- 【排序算法】经典排序算法之快速排序
- Java中常见的数组排序算法(包括冒泡,选择,插入,快速排序)
- 排序算法 之 快速排序
- 排序算法-快速排序