基础算法系列(十八)排序算法之快速排序

来源:互联网 发布:mac给iphone刷机 编辑:程序博客网 时间:2024/05/16 16:18

快速排序:(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都

要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数

据变成有序序列。

根据概念可以看出来,我们需要一个中间值来讲数组分为两部分,中间值的选取还是要选好的。

上代码

/** * 快速排序升序 */public static void sort_kuaishu_asc(int[] array, int start, int end) {int length = end - start + 1;if (length < 2)return;else if (length == 2) {if (array[start] > array[end]) {int temp = array[end];array[end] = array[start];array[start] = temp;return;}} else {// 得出最大值和最小值int min = array[start], max = array[start];for (int i = start; i < start + length; i++) {if (array[i] < min)min = array[i];if (array[i] > max)max = array[i];}// 找出合适的中间数(按中间值找,最好是像计数排序一样先统计比元素小的个数,然后按照个数确定哪个做中间数)int absMid = (min + max) / 2;int offset = Math.abs(array[start] - absMid);int relativeMid = array[start];int midIndex = start;for (int i = start; i < start + length; i++)if (Math.abs(array[i] - absMid) < offset) {offset = Math.abs(array[i] - absMid);relativeMid = array[i];}int[] newArray = new int[length];for (int i = 0; i < newArray.length; i++)newArray[i] = -1;for (int i = start, startIndex = 0, endIndex = length - 1; i < start+ length; i++) {if (array[i] < relativeMid) {newArray[startIndex] = array[i];startIndex++;} else if (array[i] > relativeMid) {newArray[endIndex] = array[i];endIndex--;}}for (int i = 0; i < newArray.length; i++)if (newArray[i] == -1)newArray[i] = relativeMid;for (int i = start, newIndex = 0; i < start + length; i++, newIndex++) {array[i] = newArray[newIndex];if (array[i] == relativeMid)midIndex = i;}sort_kuaishu_asc(array, start, midIndex - 1);sort_kuaishu_asc(array, midIndex + 1, length - 1 + start);}}

/** * 快速排序降序 */public static void sort_kuaishu_dasc(int[] array, int start, int end) {int length = end - start + 1;if (length < 2)return;else if (length == 2) {if (array[start] < array[end]) {int temp = array[end];array[end] = array[start];array[start] = temp;return;}} else {// 得出最大值和最小值int min = array[start], max = array[start];for (int i = start; i < start + length; i++) {if (array[i] < min)min = array[i];if (array[i] > max)max = array[i];}// 找出合适的中间数(按中间值找,最好是像计数排序一样先统计比元素小的个数,然后按照个数确定哪个做中间数int absMid = (min + max) / 2;int offset = Math.abs(array[start] - absMid);int relativeMid = array[start];int midIndex = start;for (int i = start; i < start + length; i++)if (Math.abs(array[i] - absMid) < offset) {offset = Math.abs(array[i] - absMid);relativeMid = array[i];}int[] newArray = new int[length];for (int i = 0; i < newArray.length; i++)newArray[i] = -1;for (int i = start, startIndex = 0, endIndex = length - 1; i < start+ length; i++) {if (array[i] > relativeMid) {newArray[startIndex] = array[i];startIndex++;} else if (array[i] < relativeMid) {newArray[endIndex] = array[i];endIndex--;}}for (int i = 0; i < newArray.length; i++)if (newArray[i] == -1)newArray[i] = relativeMid;for (int i = start, newIndex = 0; i < start + length; i++, newIndex++) {array[i] = newArray[newIndex];if (array[i] == relativeMid)midIndex = i;}sort_kuaishu_dasc(array, start, midIndex - 1);sort_kuaishu_dasc(array, midIndex + 1, length - 1 + start);}}

调用代码

SortUtil.sort_kuaishu_asc(array, 0, array.length - 1);SortUtil.sort_kuaishu_dasc(array, 0, array.length - 1);


0 0
原创粉丝点击