1.何为选择排序:
以升序为例:
2.重复上述步骤,知道数组有序
2.优化方式
1.为减少交换次数,每一轮可以先找到最小的索引,再每轮最后交换元素的位置
3.与冒泡排序比较
1.两者的时间复杂度都为O(n²)
2.选择排序一般快于冒泡排序,因为其交换次数少
3.但如果集合有序度高,冒泡优于选择
/** * 选择排序 */ public class SelectSort { public static void main(String[] args) { // 原始数据 int[] arr = {1,4,2,7,5,8,9}; // 选择排序方法 selectSort(arr); } private static void selectSort(int[] arr) { // 需要执行的轮次 for (int i = 0; i < arr.length-1; i++) { // i 代表每轮最小元素需要交换到的索引 int s = i; for (int j = s + 1; j < arr.length; j++) { // 和数组每个元素比对 if (arr[s] > arr[j]) { // 给最小元素索引赋值 s = j; } } // 判断本轮最小元素是否就是本轮的索引i,如果不是说明发生了交换 if (s != i) { swap(arr,s,i); } System.out.println(Arrays.toString(arr)); } } public static void swap(int[] arr,int i,int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
1.何为插入排序
1.将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需要保证顺序)
2.重复上述步骤,直到整个数组有序
2.优化方式
1.待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较
2.插入时可以直接移动元素,而不是交换元素
3.与选择排序比较
1.两者平均时间复杂度都是O(n²)
2.大部分情况下插入都略优于选择
3.有序集合插入的时间复杂度是O(n)
/** * 插入排序 */ public class InsertSort { public static void main(String[] args) { // 原始数据 int[] arr = {1,4,2,7,5,8,9}; // 插入排序 insertSort(arr); } private static void insertSort(int[] arr) { // i代表插入元素的索引 for (int i = 1; i < arr.length; i++) { // t代表要插入元素的值 int t = arr[i]; // j代表已排序的元素索引 int j = i - 1; // 如果数组第一个元素也比完了就跳过比较循环 while (j >= 0) { // 如果要插入的元素小于最后一个已排序的元素 if (t < arr[j]) { // 最后一排元素往后移一位 arr[j + 1] = arr[j]; }else { //如果改值没有比当前要插入元素小就跳出循环 break; } // 已排元素索引往前移一个,让要插入的元素继续与上一个已排元素比较 j--; } // 把要插入的元素插入到最后比较的元素位置 arr[j + 1] = t; System.out.println(Arrays.toString(arr)); } } }