Java学习第14天—数组高级应用—比较排序及其优化

 比较排序

比较排序:compare(选择排序:select)

原理:依次拿某个位置上的元素和其后的所有元素比较,大的放后边,每次确定的就是此位置上的元素.比较的趟数是元素个数减1

package com.nim.sort;

/*
 * 比较排序及其优化
 */
public class SelectSortDemo {

	public static void main(String[] args) {
		int[] arr = getArray();
		System.out.println("排序前");
		print(arr);

		int[] arr2 = copyArray(arr);
		System.out.println("排序前");
		print(arr2);
		
		System.out.println("----------------");
		selectSort(arr);
		System.out.println("排序后");
		print(arr);
		
		selectSort2(arr2);
		System.out.println("排序后");
		print(arr2);
	}

	// 复制一个数组
	public static int[] copyArray(int[] arr) {
		int[] arr2 = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			arr2[i] = arr[i];
		}
		return arr2;
	}

	// 生成一个元素个数为1000的随机数组
	public static int[] getArray() {
		int[] arr = new int[1000];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 1000 + 1);
		}
		return arr;
	}

	// 打印方法
	public static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			if (i != 0 && i % 100 == 0) {
				System.out.println();
			}
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

	// 比较排序(选择排序)
	public static void selectSort(int[] arr) {
		// 外层循环控制比较的轮数,固定值元素个数-1
		int count = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			// 内层循环控制的是两两比较的次数
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
					count++;
				}
			}
		}
		System.out.println("优化前的比较排序交换的次数是:" + count);
	}

	// 优化比较排序
	public static void selectSort2(int[] arr) {
		// 外层循环控制比较的轮数,固定元素个数-1
		int count = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			// 先记录确定位置上的索引和值
			int index = i;
			int value = arr[i];
			// 找到除了确定索引位置之外的元素最小值
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[j] < value) {
					index = j;
					value = arr[j];
				}
			}
			// 确定是否有必要交换两个位置的值
			if (index != i) {
				int temp = arr[i];
				arr[i] = arr[index];
				arr[index] = temp;
				count++;
			}
		}
		System.out.println("优化后的比较排序交换的次数是:" + count);
	}
}

冒泡排序:

第一轮排序:确定数组最后位置上的元素。两两比较大的往后移;第二轮排序:确定数组倒数第二位置上的元素。两两比较,大的往后移。其他位置上的元素以此类推排序

比较的轮数为元素个数减1,(剩最后一个位置,只有一个元素,不需要比较了)每轮中两两比较的次数逐渐递减

使用循环的嵌套

外层循环控制比较的轮数 次数固定 元素个数减1

内层循环控制每轮比较中两两交换的次数

比较排序(选择排序)

第一轮排序:确定数组第一个位置上的元素,用第一个和后面的比,谁小谁放在第一个位置,再用第一个位置的数和后后面的比,再把小的放在第一个.......

第二轮排序:确定数组第二个位置上的元素,和第一轮一样的比较方法。。。。。。

比较轮数 :元素个数减1

使用循环嵌套
外层循环控制比较的轮数,次数固定元素个数减1

内层循环控制的是当前位置和其后所有元素进行比较的次数,开始值随着轮数增加,结束值始终是最后一个元素。

比较排序的优化  确定某个元素时,有可能交换多次

优化 先把要确定的某个位置的索引和值记录下来

然后确定剩下元素的最小值,再和记录的值比较看是否需要交换,如果比确定的值小,就交换。


 

猜你喜欢

转载自blog.csdn.net/chengming320/article/details/82711757
今日推荐