关系和简介
********
1.本文所介绍算法均以“升序”为例。
2.稳定算法:数组中有{……,a,……,b,……},且a=b,排序后a,b的相对顺序不会发生改变的算法
3.不稳定算法:数组中有{……,a,……,b,……},且a=b,排序后a,b的相对顺序可能会发生改变的算法
********
插入排序
规则
通俗来讲,像玩扑克牌一样,第一张直接拿在手里,第二张比第一张大的话,放在右侧,小的话,放在左侧。第三张和第二张先比较,大的继续放在右侧,小的再去和第一张比较,大的话,此张成为第二张,原第二张想后移动,变成第三张,第一张不变,小的话,此张变为第一张,原来的两张依次后移。第4.5.6……n张如是。
代码
public Integer[] insertAscSort(Integer[] arr){ for (int i=1; i<arr.length; i++) { int value = arr[i];//待插入数据 int j = 0;//待插入位置 for (j = i-1; j >= 0; j--) {//已排序数组 if (arr[j] > value) { arr[j+1] = arr[j];//移动数据 } else { break; } } arr[j+1] = value; //插入数据 } return arr; }
冒泡排序
规则
在每一轮排序中,从第一个元素开始,比较相邻的两张牌的大小,若前面的元素>后面的元素,则交换元素,否则不动。
代码
private Integer[] bubbleAscSort(Integer[] arr){ int temp = 0; for(int i=0;i<arr.length-1;i++){//循环次数 for(int j=0;j<arr.length-1-i;j++){//指针 if(arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }
选择排序
规则
在第一轮的排序中,遍历整个数组,记录最小的元素的下标,将其和下标为0元素交换。
在第N(N>1)轮的排序中,遍历从下标从n(n>0)开始的数组,记录最小的元素,将其和下标为n的元素进行交换。
代码
private Integer[] selectAscSort(Integer[] arr) { for (int i=0; i<arr.length-1; i++) { Integer minIndex=i; //最小元素下标 for (int j=i; j<arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex=j; } } if (minIndex!=i) { Integer temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex = temp;] } } return arr; }