本文参考了《算法导论》及如下博客:
http://blog.jobbole.com/105219/
https://blog.csdn.net/AA2519556/article/details/77884962
https://www.cnblogs.com/zuilehongdou/p/6197716.html
http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/
https://blog.csdn.net/u013457167/article/details/79749882 (思路理解在这篇文章中汇总)
注:上述博客在考虑end是元素的个数n,留意end对应的元素是否被访问,避免漏掉。
Pa
package Findwork; /** * @author hadoop *针对的是版本1中出现的一些问题,现在进行完善; * */ public class partitionFun_2 { public static void main(String[] args) { //int arr[]= {5,9,2,1,4,7,5,8,3,6}; partitionFun_2 p = new partitionFun_2(); int arr[]=p.randomArr(50, 100); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+ " "); } p.quickSort(arr, 0, arr.length-1); System.out.println(); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+ " "); } } public int partition(int arr[],int left ,int right) //采用指针进行比较 { int pivot = arr[left]; int pivotIndex = left; for(int i=left +1;i<=right;i++) { if(arr[i]<=pivot) { pivotIndex++; swap(arr,pivotIndex,i); } } swap(arr, left, pivotIndex); return pivotIndex; } public int partition2(int arr[],int left ,int right) //采用两个指针在寻找 { int pivot = arr[left]; int pivotIndex = left; while(left<right) { while(left<right && arr[right]>=pivot) right--; arr[left] = arr[right]; while(left<right && arr[left]<pivot) left++; arr[right] = arr[left]; } arr[left] = pivot; pivotIndex =left; return pivotIndex; } //分别可以使用上面两种partition函数实现快排,快排递归条件要控制好 public void quickSort(int arr[],int left ,int right) { if (left>=right)//递归终止的条件 { return; } int mid = partition2(arr, left, right); quickSort(arr, left, mid); quickSort(arr, mid+1, right); } //假如不调用partition 函数 直接写出快排 public void quickSort2(int arr[],int left ,int right) { if (left>=right) { return ; } int pivot =arr[left]; int pivotIndex = left; for (int i =left +1;i<=right;i++) { if (arr[i]<=pivot) { pivotIndex++; swap(arr, pivotIndex, i); } } swap(arr, pivotIndex, left); quickSort2(arr, left, pivotIndex); quickSort2(arr, pivotIndex+1, right); } public void swap(int arr[],int a ,int b)// 数组中两个元素互换 { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } //生成随机数 数组 siz2数组大小 max数以内的值 public int[] randomArr(int size,int max) { int arr[] =new int [size]; for (int i=0;i<arr.length;i++) { arr[i] = (int)(Math.random()*10000%max); //random函数是随机0到1之间的随机数 } return arr; } }
rtition函数的枢纽取值有多种取法(取头、取尾等),最好是取元素随机值,时间复杂度低。
Partition函数的理解以及Java实现 + 快速排序的多种实现
猜你喜欢
转载自blog.csdn.net/qq_28619473/article/details/88617275
今日推荐
周排行