1 递归思想
- 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
2 快速排序
- 冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
- 快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置
- 之后分为两边还是无序状态继续套用前面方法也就是递归的过程
3 源码详解
public class QuickSortTest { public static void main(String[] args) { // 1,从右开始找比基准数小的 // 2,从左开始找比基准数大的 // 3,交换两个值的位置 // 4,红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止 // 5,基准数归位 int[] arr = {1,2,4,8,5,1}; //参数 数组和遍历长度 quiteSort(arr,0,arr.length-1); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } /** * * @param arr * @param start * @param end */ private static void quiteSort(int[] arr, int start, int end) { //递归到最后肯定就剩一个了所有数归为 如果判断到不论前后+1 -1就要跳出去这个递归 if(end < start){ return; } //为了基准数归位服务 int left0 = start; //为了递归服务 因为数值不断发生改变 要用到开始和结束时找不到所以临时缓存这两个 int right0 = end; //基准数一般都是左边第一个 int baseNumber = arr[left0]; //相等就代表找到了 end > start要控制不能超过基准或者等于后继续空指针异常 while(start != end){ // 1,从右开始找比基准数小的 // arr[end] >= baseNumber 如果相等的话但是也不是同一个位置就死循环了 while(arr[end] >= baseNumber && end > start){ end--; } // 2,从左开始找比基准数大的 while(arr[start] <= baseNumber && end > start){ start++; } // 3,都不满足条件 也就是 end=start 交换两个值的位置 int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; } //基准数归位 两次交换 一次是分左边右边 然后分完左边右边后就相等到一个位置让基准数归为 int temp = arr[start]; arr[start] = arr[left0]; arr[left0] = temp; //最后走这两部都要形成只有一个数需要比较的阶段后肯定要错位 走到出口 //从0开始到重合位置-1 quiteSort(arr,left0,start-1); //从重合位置+1到末尾 quiteSort(arr,start +1,right0); } }
4 设计顺序
应该先写出一次的排序,较为简单,之后再去递归找出口,其实快速排序是对冒泡排序的一种改进。它的基本思想是:分治思想,通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。