比较排序
比较排序: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
内层循环控制的是当前位置和其后所有元素进行比较的次数,开始值随着轮数增加,结束值始终是最后一个元素。
比较排序的优化 确定某个元素时,有可能交换多次
优化 先把要确定的某个位置的索引和值记录下来
然后确定剩下元素的最小值,再和记录的值比较看是否需要交换,如果比确定的值小,就交换。