快速排序-Java版
快速排序(Quicksort)式对冒泡排序的一种改进,基本思想式:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序的java代码写了两个,一个式韩顺平的,另一个式自己改的(感觉更好懂,简易点。测试过很ok,是否存在其他没考虑的问题还不明确~)
1、自己改进的快排,如下:
public static void quickSort(int[] arr,int left,int right) { int l=left; //左下标 int r=right; //右下标 //pivot 中轴值 int pivot = arr[(left+right)/2]; int temp=0; //临时变量,作为交换时使用 //while循环的目的式让比pivot小的值放在左边,比pivot大的值放在右边; while(l<r) { //在pivot的左边开始找,找到大于等于pivot的值, 才退出. while( arr[l] < pivot) { l+=1; } //在pivot的右边开始找,找到小于等于pivot的值, 才退出. while( arr[r] > pivot) { r-=1; } if(l>=r) { break; } //交换 temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; } l--; r++; //向左递归 if (left < l) { quickSort(arr, left, l); } // 向右递归 if (right > r) { quickSort(arr, r, right); } }2、韩顺平的快排,如下
public static void quickSort_hanshunping(int[] arr,int left,int right) { int l=left; //左下标 int r=right; //右下标 //pivot 中轴值 int pivot = arr[(left+right)/2]; int temp=0; //临时变量,作为交换时使用 //while循环的目的式让比pivot小的值放在左边,比pivot大的值放在右边; while(l<r) { //在pivot的左边开始找,找到大于等于pivot的值, 才退出. while( arr[l] < pivot) { l+=1; } //在pivot的右边开始找,找到小于等于pivot的值, 才退出. while( arr[r] > pivot) { r-=1; } if(l>=r) { break; } //交换 temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; //如果交换完后, 发现这个arr[l]==pivot值 r--, 前移 if(arr[l] == pivot) { r-=1; } //如果交换完后, 发现这个arr[r]==pivot值 l++, 后移 if(arr[r] == pivot) { l+=1; } } //如果 l==r, 必须l++, r--, 否则会出现栈溢出 if(l==r) { l += 1; r -= 1; } //向左递归 if(left < r) { quickSort(arr, left, r); } //向右递归 if(right > l) { quickSort(arr, l, right); } }3、主方法如下
public static void main(String[] args) { int[] arr= {-9,78,8,23,-567,70,-1,900,4561}; quickSort(arr, 0, arr.length-1); //quickSort_hanshunping(arr, 0, arr.length-1); System.out.println("arr="+Arrays.toString(arr)); }