快速排序
快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。一趟快速排序的具体过程可描述为:从待排序列中任意选取一个记录(通常选取第一个记录)作为基准值,然后将记录中关键字比它小的记录都安置在它的位置之前,将记录中关键字比它大的记录都安置在它的位置之后。这样,以该基准值为分界线,将待排序列分成的两个子序列。
一趟快速排序的具体做法为:设置两个指针x和y分别指向待排序列的开始和结尾,记录下基准值baseval(待排序列的第一个记录),然后先从y所指的位置向前搜索直到找到一个小于baseval的记录并互相交换,接着从x所指向的位置向后搜索直到找到一个大于baseval的记录并互相交换,重复这两个步骤直到x=y
public class quick { public static void main(String[] args) { //快速排序 int arr[] = {21, 532, 54, 32, 612, 34, 56, 12, 8, 12, 53,78,65,40,44}; int start=0,end=arr.length-1;//第一个数的位置和最后一个数的位置 QuickSort(arr,start,end); System.out.println(Arrays.toString(arr)); } public static void QuickSort(int arr[],int start,int end){ if (start >= end) return; int i = start; int j = end; // 第一个数和最后一个的位置 int baseval = arr[start];//基准数备份 while (i < j) { // 从右向左找比基准数小的数 while (i < j && arr[j] >= baseval) { j--;//依次向前 } if (i < j) { arr[i] = arr[j];//把找到的比基准数小的放在最前面 覆盖掉基准数 i++; } // 从左向右找比基准数大的数 while (i < j && arr[i] < baseval) { i++;//依次向后 } if (i < j) { arr[j] = arr[i]; j--; } } // 把基准数放到i的位置 arr[i] = baseval; //递归 QuickSort(arr, start, i - 1); QuickSort(arr, i + 1, end); }