本文共 3113 字,大约阅读时间需要 10 分钟。
思想:
1,找出标准值:取要进行递归排序的数组片段的最左边的数; 2,开始循环查找:(循环条件,左游标<右游标) 2.1,当右边的数大于标准值时,右游标左移; 2.2,当右边的数小于标准值时,用右边的数替换掉左边游标对应的数值; PS:第一次替换时其实替换掉的此时的左边的数就是标准值; 2.3,当左边的数小于标准值时,左游标右移; 2.4,当左边的数大于标准值时,用左边的数替换掉右边游标对应的数值; 3,最后,当左右游标重合时,跳出了循环,此时用标准值替换掉左右游标重合时的数; 4,此时,标准值左边的数都小于标准值,标准值右边的数都大于标准值,开始递归,(递归出口为:进行递归的数组片段起码有两个数,不然当数组只有一个数的时候就不需要进行排序了:即,数组最左边的数的索引 < 数组最右边的数的索引); 4.1,左半边递归:最左边的数是 数组片段的最左边的下标索引,最右边的数是 左游标; 4.2,右半边递归:最左边的数是 右游标+1,最右边的数是 数组片段的最右边的下标索引;
/** * @param arr:要进行递归排序的数组 * 因为递归的时候,是对数组中不同的每一块进行递归,所以要告诉是数组中的哪一块,所以有leftIndex和rightIndex; * @param leftIndex:要进行递归排序的数组 的最左边的数的下标索引; * @param rightIndex:要进行递归排序的数组 的最右边的数的下标索引; * @return*/public static int[] kuaipai(int arr[], int leftIndex, int rightIndex) { //1,我们通常以该数组片段的第一个数为标准值: int standard = arr[leftIndex]; //2,设置左游标,右游标; int leftYouBiao = leftIndex; //左游标一开始肯定是从数组片段的最左边开始; int rightYouBiao = rightIndex; //右游标一开始肯定是从数组片段的最右边开始; //3,开始循环查找: // 搞一个循环,左游标循环的找比标准值大的数,右游标循环的找比标准值小的数,低的往高的走,高的往低的走,总有一个结束条件吧,循环的结束条件是,左游标是否是小于右游标的,(如果它们两个重合了,就是相等了嘛,就不需要再继续挪动游标了)。所以循环的结束条件肯定是左右游标重合了,就不用再接着查找了; while (leftYouBiao < rightYouBiao) { //4,当右边的数一直大于等于标准值时,右游标一直左移: //右游标左移也不能过猛,不能小于了左游标:rightYouBiao>leftYouBiao while (rightYouBiao>leftYouBiao && arr[rightYouBiao] >= standard) { rightYouBiao--; } //5,当右边的数小于标准值了,此时,用右边的数替换掉此时的左边的数; if (arr[rightYouBiao] < standard) { arr[leftYouBiao] = arr[rightYouBiao]; } //6,当左边的数一直小于等于标准值时,左游标一直右移: // 左游标右移也不能过猛,不能大于了右游标:leftYouBiaostandard) { arr[rightYouBiao] = arr[leftYouBiao]; } } //8,当左右游标重合了,此时leftYouBiao == rightYouBiao,则出了while循环; // 此时,将标准值再去替换了此时左右游标所在的那个数值: // 直至左右游标重合之后,即指向同一个数字之后,用标准值替换掉重合的这个数字,因为不替换的话,这整个数组的元素就变了; arr[leftYouBiao] = standard; //这里也可以换成 arr[rightYouBiao]也行,一样的; //9,此时,标准值左边的数小于标准值,标准值右边的数大于标准值,开始递归: // 递归必须要有递归出口:即要进行排序的数组片段起码要有两个数,即数组的最左边的下标索引
来一个清爽版的,自己试着理解这段代码:
/** * @param arr:要进行递归排序的数组 * @param leftIndex:要进行递归排序的数组 的最左边的数的下标索引; * @param rightIndex:要进行递归排序的数组 的最右边的数的下标索引; * @return*/public static int[] kuaipai(int arr[], int leftIndex, int rightIndex) { int standard = arr[leftIndex]; int leftYouBiao = leftIndex; int rightYouBiao = rightIndex; while (leftYouBiao < rightYouBiao) { while (rightYouBiao>leftYouBiao && arr[rightYouBiao] >= standard) { rightYouBiao--; } if (arr[rightYouBiao] < standard) { arr[leftYouBiao] = arr[rightYouBiao]; } while (leftYouBiaostandard) { arr[rightYouBiao] = arr[leftYouBiao]; } } arr[leftYouBiao] = standard; if (leftIndex < leftYouBiao) { kuaiPai(arr, leftIndex, leftYouBiao); } if (rightYouBiao + 1 < rightIndex) { kuaiPai(arr, rightYouBiao + 1, rightIndex); } return arr;}
转载地址:http://eytzi.baihongyu.com/