快速排序
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
基本步骤为: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); } }