赞
踩
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
基本步骤为:
1.设定关键字,划分成两个数组,比关键字小的放在一边,大的放在另一边
2.我们选择设置数组最右端为关键字
3.递归实现快速排序,通过递归给每一个子数组快速排序
我们看个例子:
有一组int类型数据:arr[ 6 ] = { 9 ,2 ,7 ,3 ,8 ,6 } ;
那么进行快速排序时候:
首先设置两个指针,从最左和最右向中间靠拢,遇到比关键字大(小)就停,然后交换位置,再继续向中间靠拢。获得排序切入点(第 i 个位置)。
第一轮:6为关键字,进行分割数组(并不排序):(大括号里的是子串)
{2,3}和{9,7,8}然后把6插入到中间第 i (2)位上,
结果:{2,3},6,{9,7,8}
第二轮:从0开始到 i 进行一次快排(选取3作为关键字);从 i +1到 arr.length - 1进行快排(选8关键字)
结果:{2},3,6,{7},8,{9}
第三轮结果:对3个子串再快排(同上)
结果:2,3,6,7,8,9
快排完成。
那么接下来代码实现:(java)
- //快速排序
- //划分成两个数组,通过递归给每一个子数组快速排序
- //1.设定关键字,比关键字小的放在一边,大的放在另一边
- //2.设置数组最右端为关键字
- //3.递归实现快速排序
- public class QuickSort {
-
- //划分数组
- public static int part(long[] arr , int left , int right , long point) {
- //两个指针
- int leftptr = left - 1;
- int rightptr = right;
-
- while(true) {
- //从最左和最右开始找,比point大的放右边,比point小的放左边
- while(leftptr < rightptr && arr[++leftptr] < point);
- while(leftptr < rightptr && arr[--rightptr] > point);
-
- //找到后交换,然后再继续找
- if(leftptr >= rightptr) {
- break;
- }
- else {//交换
- long tmp = arr[leftptr];
- arr[leftptr] = arr[rightptr];
- arr[rightptr] = tmp;
- }
- }
- //数组分割完毕,把关键字插入中间
- long tmp = arr[leftptr];
- arr[leftptr] = arr[right];
- arr[right] = tmp;
-
- //返回切入点位置
- return leftptr;
- }
-
- public static void sort(long[] arr , int left , int right) {
- if (right <= left) {
- return;
- }
- else {
- //设置最右为关键字
- long point = arr[right];
- //获得切入点同时划分
- int part = part(arr, left, right, point);
- //递归对左边数组排序
- sort(arr, left, part - 1);
- //右边排序
- sort(arr, part + 1, right);
- }
-
- }
-
- //打印数组
- public static void displayArr(long[] arr) {
- for(int i = 0 ; i < arr.length ; i++) {
- System.out.print(arr[i] + " ");
- }
- System.out.println();
- }
- }

test类:这里选取随机生成10个数字进行排序
- public class TestQuickSort {
-
- public static void main(String[] args) {
- // TODO 自动生成的方法存根
- long[] arr = new long[10];
- for(int i = 0 ; i < arr.length ; i++) {
- arr[i] = (long) (Math.random() * 99);
- }
- long point = arr[arr.length - 1];
-
- QuickSort.displayArr(arr);
-
- // QuickSort.part(arr, 0, arr.length - 1, point);
-
- // QuickSort.displayArr(arr);
-
- QuickSort.sort(arr, 0, arr.length - 1);
-
- QuickSort.displayArr(arr);
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。