【算法】JAVA快速排序法实现

来源:互联网 发布:centos supervisor 编辑:程序博客网 时间:2024/06/15 19:52

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public class QuickSort {  public static void main(String[] args) { //测试数据  int[] iArgs = {5,4,9,2,8,3,1,7};  int left = 0; //数组第一个位置  int right = iArgs.length - 1;//数组最后一个位置;  QuickSort quickSort = new QuickSort();  //快速排序  quickSort.recursive(iArgs,left,right);  //输出数组  for(int i = 0; i < iArgs.length; i++) {System.out.print(iArgs[i] + " ");  }  }    /**   * 递归循环数据   *    * @param args 数组   * @param left 数组左下标   * @param right 数组右下标   * @return   */  private void recursive(int[] args,int left,int right) { if( left < right) { //数据从left到right坐标的数据进行排序 int iIndex = qucikSort(args,left,right); //iIndex 是基数放在数据位置  //递归算法,对于基数左边排序  recursive(args,left,iIndex-1); //为什么left不能从0  //递归算法,对于基数右边排序  recursive(args,iIndex+1,right);//为什么 right不等于length }  }    /**   * 确定基数左边的数都比它小,右边的数都比它大    *    * @param args 数组   * @param left 数组左下标   * @param right 数组右下标   * @return   */  private int qucikSort(int[] args,int left,int right) {  int iBase = args[left];; //基准数  while (left < right) { //从右向左找出第一个比基准数小的数  while( left < right && args[right] >= iBase) {  right--;  }  args[left] = args[right];    //从左向右找出第一个比基准数小的数  while( left < right && args[left] <= iBase) {  left++;  }  args[right] = args[left];  }  args[left]= iBase;  return left;  }}

另一种写法:

public class QuickSort {/** * @param args */public static void main(String[] args) {int[] array = {10, 20, 15 , 16, 18 , 17, 12, 13, 19, 11, 14};QuickSort(array, 0, array.length - 1);for(int i = 0; i < array.length; i++){System.out.print(array[i]+" ");}}private static void QuickSort(int[] array, int low, int high) {if(low < high){int position = Partition(array, low, high);QuickSort(array, low, position-1);QuickSort(array, position+1, high);}}private static int Partition(int[] array, int low, int high) {int start = low;int end = high + 1;int compare = array[low];int tmp;while(true){while(array[++start] < compare && start < high);while(array[--end] > compare);if(start >= end) break;tmp = array[start];array[start] = array[end];array[end] = tmp;}array[low] = array[end];array[end] = compare;return end;}}



0 0
原创粉丝点击