文章目录
0.算法复杂度比较
1.直接插入排序
插入排序(Insertion Sort) 是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
class Insert {
public static int[] insert(int[] arr) {
int length = arr.length;
for (int i=0; i<arr.length; i++) {
int tmp = arr[i];
int j;//j从当前的i开始向前遍历
for (j=i; j>0 && arr[j-1]>tmp; j--) {
//i是当前值,如果arr[j-1]比当前值大,arr[j-1]就要向后移一位。
arr[j] = arr[j-1];
}
arr[j] = tmp;//当前的j就是应该插入的位置;
}
return arr;
}
public static void main(String[] args){
int[] arr = new int[]{
3,6,8,4,5,7,11};
arr = insert(arr);
System.out.println(Arrays.toString(arr));
}
}
参考:
https://blog.csdn.net/qq_28081081/article/details/80594386
2.Shell排序
希尔排序(Shell Sort) 也叫做缩小增量排序,是插入排序的改进版本。 它通过先设置一个增量n,大小为数组长度的一半,将间隔为n的元素视作一个组,然后对每个组内部的元素进行从小到大进行插入排序;然后再将增量n缩小一半,再次进行分组插入排序,直到增量n为1,因为增量为1的时候,所有的元素都为同一个组了。
class Shell{
public static int[] shellSort(int[] arr){
// 1. 获取数组长度
int length = arr.length;
// 2.获取初始的间隔长度
int interval = (int)Math.floor(length/2.0);
// 3. 不断地缩小间隔的大小,进行分组插入排序
while (interval>=1) {
// 4. 从 arr[interval] 开始往后遍历,将遍历到的数据与其小组进行插入排序
for (int i=interval;i<length;i++) {
int tmp = arr[i];//tmp后值
int j = i;
while (j-interval>=0 && arr[j-interval]>tmp){
//前值比后值大的情况
arr[j] = arr[j-interval];//后值用前值代替
j = j-interval;
}
arr[j] = tmp;
}
// 5. 缩小间隔
interval = (int)Math.floor(interval/2.0);
}
return arr;
}
public static void main(String[] args){
int[] arr = new int[]{
3,6,8,4,5,7,11,3,3,3,3,2,1};
arr = shellSort(arr);
System.out.println(Arrays.toString(arr));
}
}
3.直接选择排序
选择排序(Selection sort) 是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为选择排序。
设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素找到最小的元素,将它和第一个元素互换。重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序。
class Select {
public static int[] select_sort(int[] arr) {
//第一层for表示循环选择的遍数
int length = arr.length;
for (int i=0; i<length-1; i++) {
int iMin = i;//将起始元素设为最小元素
// 第二层for表示最小元素和后面的元素逐个比较
for (int j=i+1; j<length; j++) {
if (arr[j] < arr[iMin]){
//如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
iMin = j;
}
}
// 查找一遍后将最小元素与起始元素互换
if (iMin!=i){
int tmp = arr[iMin];
arr[iMin] = arr[i];
arr[i] = tmp;
}
}
return arr