算法分析(四) 插入排序

本贴最后更新于 2687 天前,其中的信息可能已经时移世改

插入排序

插入排序是从数组第 n 位开始,与前面的每位进行逐一比较,比前一位大则交换一次位置,直到不比前面的某一位小停下继续对 n+1 做重复操作到数组遍历结束。

实现代码

public class InsertSelectionSort {
	/*
	 * 1.第一位不用动,从第二位开始和前面依次进行比较,小的话交换位置不小就停下
	 */

	// 我们的算法类不允许产生任何实例
	private InsertSelectionSort() {
	}

	public static void sort(Comparable[] arr) {
		int n = arr.length;
		for (int i = 1; i < n; i++) {// 对第i个进行插入排序
			for (int j = i - 1; j >= 0; j--) {// 循环与i前面的进行比较,比前一个小就交换一次,直到不比前面小停止
				if (arr[i].compareTo(arr[j]) < 0) {// arr[i]小 交换
					swap(arr, j+1, j);//修正感谢[wizardforcel](https://hacpai.com/member/wizardforcel)
				} else {
					break;
				}
			}
		}
	}

	private static void swap(Object[] arr, int i, int j) {
		Object temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

本次不写这么详细了,个人感觉插入排序和选择排序有些相似,这个排序算是从后向前进行的。没有详细的思考比较,最近比较忙,有时间补上泛型实现和思考总结。
  • 插入排序
    1 引用 • 9 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • 算法
    428 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • leap

    可以考虑用链表实现下。

    1 回复
  • Angonger

    谢谢建议!数据结构算法刚在入门,我再学习学习

    1 回复
  • leap

    加油 ❤️

  • wizardforcel

    应该是 arr[j + 1].compareTo(arr[j]) 吧。

    1 回复
  • Angonger

    我的 i = j + 1

    1 回复
  • wizardforcel

    换完了 arr[i] 就变了,不是你插入的那个元素了。。。

    1 回复
  • Angonger

    我没看出影响

    i=1;
    swap(arr[1] ,arr[0]); 
    
    i=2;
    swap(arr[2] ,arr[1]); 
    

    无论上次执行什么结果,我操作比较交换的都是当前循环的 i 位置和当前的 j 位置,和上次执行的 arr[i] 没关系吧。

    1 回复
  • wizardforcel

    i=1 的时候没问题。

    i=2 的时候你交换 2,12,0,但是实际上应该交换 2,11,0

    1 回复
  • Angonger

    明白!谢谢!

请输入回帖内容 ...