排序算法

来源:互联网 发布:叽萝捏脸数据 编辑:程序博客网 时间:2024/06/05 08:40

1

public class SortTest {public static int test1[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };public static int test2[] = { 3, 1, 6, 4, 5, 2 };public static int test3[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24, 19 };public static void main(final String[] args) {// bubbleSort(test2);// selectSort(test2);quickSort(test3);}/** * 冒泡排序算法(升序)的运作如下: * 比较【相邻】的元素。如果第一个比第二个大,就交换他们两个。 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 针对所有的元素重复以上的步骤,除了最后一个(最后一个已经是上一趟中找出的最大的元素了,不需要再排序)。 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 *  * @param array */public static void bubbleSort(final int[] array) {System.out.println("冒泡排序开始:\n0:" + Arrays.toString(array));int changeNum = 1;for (int i = 0; i < array.length - 1; i++) {System.out.println("开始第" + (i + 1) + "趟");for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {final int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;System.out.println(changeNum++ + ":" + Arrays.toString(array));}}}System.out.println("冒泡排序结束!");/* * 冒泡开始: * 0:[3, 1, 6, 4, 5, 2] * 开始第1趟 * 1:[1, 3, 6, 4, 5, 2] * 2:[1, 3, 4, 6, 5, 2] * 3:[1, 3, 4, 5, 6, 2] * 4:[1, 3, 4, 5, 2, 6] * 开始第2趟 * 5:[1, 3, 4, 2, 5, 6] * 开始第3趟 * 6:[1, 3, 2, 4, 5, 6] * 开始第4趟 * 7:[1, 2, 3, 4, 5, 6] * 开始第5趟 * 冒泡结束! */}/** * 选择排序原理: * 先假设无序数组中第一个元素是最小元素(记住下标),从第二个开始依次和第一个比较; * 如果比第一个小,就把最小元素下标替换掉; * 依次比较完毕后,如果下标已经被替换,就把第一个元素和替换下标的元素交换位置; * 然后开始下一轮比较(下一轮把上一轮找到的最小的元素去掉) *  * @param array */public static void selectSort(final int[] array) {System.out.println("选择排序开始:\n0:" + Arrays.toString(array));int changeNum = 1;int minIndex = 0;// 第n趟比较中的最小元素的下标for (int i = 0; i < array.length - 1; i++) {minIndex = i;// 无序区的最小数据数组下标for (int j = i + 1; j < array.length; j++) {// 在无序区中找到最小数据并保存其数组下标if (array[j] < array[minIndex]) {minIndex = j;}}if (minIndex != i) {// 如果不是无序区的最小值位置不是默认的第一个数据,则交换之。final int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;System.out.println(changeNum++ + ":" + Arrays.toString(array));}}System.out.println("选择排序结束!");/* * 选择排序开始: * 0:[3, 1, 6, 4, 5, 2] * 1:[1, 3, 6, 4, 5, 2] * 2:[1, 2, 6, 4, 5, 3] * 3:[1, 2, 3, 4, 5, 6] */}/** * 快速排序: * ①以第一个关键字 K1 为控制字,将 [K1 ,K2 ,…,Kn ] 分成两个子区, * 使左区所有关键字小于等于 K1 ,右区所有关键字大于等于 K1 ,最后控制字居两个子区中间的适当位置。 * 在子区内数据尚处于无序状态。 * ②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归) * ③重复第①、②步,直到左区处理完毕。 *  * @param array */public static void quickSort(final int[] array) {if (array.length > 0) { // 查看数组是否为空System.out.println("快速排序开始:\n" + Arrays.toString(array) + "\n");quickSort(array, 0, array.length - 1);System.out.println("快速排序结束:\n" + Arrays.toString(array));}}private static void quickSort(final int[] array, final int low, final int high) {if (low < high) {final int middle = getMiddle(array, low, high); // 将list数组进行一分为二quickSort(array, low, middle - 1); // 对低字表进行递归排序quickSort(array, middle + 1, high); // 对高字表进行递归排序}}private static int getMiddle(final int[] array, int low, int high) {final int temp = array[low]; // 数组的第一个作为中轴while (low < high) {while (low < high && array[high] >= temp) {high--;}array[low] = array[high]; // 比中轴小的记录移到低端while (low < high && array[low] <= temp) {low++;}array[high] = array[low]; // 比中轴大的记录移到高端}array[low] = temp; // 中轴记录到尾return low; // 返回中轴的位置}}


2

3


0 0
原创粉丝点击