在冒泡排序的基础上进行快速排序的编写,
逐行注释便于理解和知识巩固
/*** @author HF* @version 1.0* @description: TODO* @date 2020/9/26 22:46*/public class SortNumberDemo {public static void main(String[] args) {int[] array = {65,21,63,8,81,13,31,72};
// bubbleSort(array);quickSort(array,0,array.length-1);for (int number : array) {System.out.print(number + "\t");}}/*** 冒泡排序* @param arr*/public static void bubbleSort(int[] arr){for(int i=0;i<arr.length;i++){for(int j=arr.length-1;j>i;j--){if(arr[i]>arr[j]){arr[j] = arr[i] - arr[j];arr[i] = arr[i] - arr[j];arr[j] = arr[j] + arr[i];}}}}/*** 快速排序* @param arr* @param arr_left* @param arr_right*/public static void quickSort(int[] arr,int arr_left,int arr_right){//快速排序的核心 其实与二分法相似//就是判断出当前数组中的中间数,并将其放在中间。//左边的数字比它小,右边的数字比它大。这样就又可以分为两个数组再次去中间值进行比对(递归调用)//int[] array = {65,21,63,8,81,13,31,72};//因为每次取中间数后,左右两边都需要在次进行数据比对,也可以理解为拆分了数组。// 这里使用下标的方式进行逻辑拆分。所以每次需要传递数组的左右两边的数组下标//首先判断数组的左下标是否小于右下标。否则下面的操作将毫无意义if(arr_left < arr_right){//左右两个下标需要使用新的变量,因为后续数组“拆分”后还需要传递最初的左右下标int left = arr_left;int right = arr_right;//设定数组最左边的一位数为该数组的中间数int temp = arr[left];//左右下标向中间逼近,同时与中间数进行对比置换 当左右下标相遇时循环结束while(left < right){//因为刚开始默认设定的中间数为左边第一位数字//所以比对从右边开始 每次比对需要保证 右边下标必须大于左边下标 并且判断该数字是否小于中位数//以上面的数组为例,72>65 右边下标向左移动while(left<right && arr[right]>=temp){right--;}//当移动到31的位置时 31<65 这时将原假定位置上的中间数进行覆盖得到{31,21,63,8,81,13,31,72}//之前的额=65早已保存在temp变量中,不要担心丢失if(left < right){arr[left] = arr[right];//覆盖完成后,后面需要开始左边的比对了(也就是需要从下一位开始比对)left++;}//判断21 63 8是否小于65while (left<right && arr[left]<temp){left++;}//直到左边循环比对到81的时候 81>65if(left < right){//将81放入到右边31的位置//右边31的位置之前已经将最左边的数字进行了覆盖,而当前位置上的31其实可以理解为空数字,只不过之前并没有置空而已arr[right] = arr[left];//覆盖之后的数组为{31,21,63,8,81,13,81,72}//循环还未结束,当前的左边下标为4 (arr[4] 【81】 ) 右边的下标为5 (arr[5] 【13】)//在后面的继续对比 因为13小于65 将再次进行覆盖操作 得到数组为{31,21,63,8,13,13,81,72}//在此,覆盖完成后左边的小右移一位 左右下标重合 第一次循环结束}}//第一次循环结束后 在数组中未置空的位置上将之前设定的中间数给补上arr[left] = temp;//得到数组为{31,21,63,8,65,13,81,72}//这样65的左边都小于或者等于65,右边大于等于65 实现了将数组进行的第一次“拆分”//后面将左右两边的数组进行再次以上的操作(递归) 完成后排序将实现数组的排序quickSort(arr,arr_left,left-1);quickSort(arr,right+1,arr_right);}}
}