首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Bubble Sort - 冒泡排序
Selection Sort - 选择排序
Insertion Sort - 插入排序
Merge Sort - 归并排序
Quick Sort - 快速排序
Heap Sort - 堆排序
Bucket Sort
Counting Sort
两数之和
两数相加
无重复字符的最长子字符串
两个排序数组的中值
最长回文子串
锯齿形变换
反转整数
合并K个排序列表
链表循环
除Self之外的数组乘积
4的威力
蛙跳
将交叉口大小设置为至少两个
最大的块,使其分类
到达点
阶乘零点函数的前像大小
建造一个大的岛屿
唯一字母串
树的距离之和
猜词游戏
节点的最短路径
矩形区域II
K-相似字符串
雇佣K工人的最低成本
至少为K的最短子阵
获取所有key的最短路径
加油站的最小数量
有利可图的计划
细分图中的可达节点
超级蛋掉落
最大频率叠加
有序队列
DI序列的有效置换
猫和老鼠
最长不含重复字符的子字符串
丑数
第一个只出现一次的字符
字符流中第一个不重复的字符
两个链表的第一个公共结点
数字在排序数组中出现的次数
0到n-1中缺失的数字
数组中数值和下标相等的元素
二叉树的深度
数组中只出现一次的两个数字
数组中唯一只出现一次的数字
翻转单词顺序
左旋转字符串
滑动窗口的最大值
当前位置:
首页>>
技术小册>>
数据结构与算法(中)
小册名称:数据结构与算法(中)
核心:通过构建有序序列,对于未排序序列,从后向前扫描(对于单向链表则只能从前往后遍历),找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) - 从第一个元素开始,该元素可认为已排序 - 取下一个元素,对已排序数组从后往前扫描 - 若从排序数组中取出的元素大于新元素,则移至下一位置 - 重复步骤3,直至找到已排序元素小于或等于新元素的位置 - 插入新元素至该位置 - 重复2~5 性质: - 交换操作和数组中导致的数量相同 - 比较次数>=倒置数量,<=倒置的数量加上数组的大小减一 - 每次交换都改变了两个顺序颠倒的元素的位置,即减少了一对倒置,倒置数量为0时即完成排序。 - 每次交换对应着一次比较,且1到N-1之间的每个i都可能需要一次额外的记录(a[i]未到达数组左端时) - 最坏情况下需要~N^2/2次比较和~N^2/2次交换,最好情况下需要N-1次比较和0次交换。 - 平均情况下需要~N^2/4次比较和~N^2/4次交换 代码实现: Python ```asp #!/usr/bin/env python def insertionSort(alist): for i, item_i in enumerate(alist): print alist index = i while index > 0 and alist[index - 1] > item_i: alist[index] = alist[index - 1] index -= 1 alist[index] = item_i return alist unsorted_list = [6, 5, 3, 1, 8, 7, 2, 4] print(insertionSort(unsorted_list)) ``` Java ```asp public class Sort { public static void main(String[] args) { int unsortedArray[] = new int[]{6, 5, 3, 1, 8, 7, 2, 4}; insertionSort(unsortedArray); System.out.println("After sort: "); for (int item : unsortedArray) { System.out.print(item + " "); } } public static void insertionSort(int[] array) { int len = array.length; for (int i = 0; i < len; i++) { int index = i, array_i = array[i]; while (index > 0 && array[index - 1] > array_i) { array[index] = array[index - 1]; index -= 1; } array[index] = array_i; /* print sort process */ for (int item : array) { System.out.print(item + " "); } System.out.println(); } } } ``` 实现(C++): ```asp template<typename T> void insertion_sort(T arr[], int len) { int i, j; T temp; for (int i = 1; i < len; i++) { temp = arr[i]; for (int j = i - 1; j >= 0 && arr[j] > temp; j--) { a[j + 1] = a[j]; } arr[j + 1] = temp; } } ``` 希尔排序 核心:基于插入排序,使数组中任意间隔为h的元素都是有序的,即将全部元素分为h个区域使用插入排序。其实现可类似于插入排序但使用不同增量。更高效的原因是它权衡了子数组的规模和有序性。 实现(C++): ```asp template<typename T> void shell_sort(T arr[], int len) { int gap, i, j; T temp; for (gap = len >> 1; gap > 0; gap >>= 1) for (i = gap; i < len; i++) { temp = arr[i]; for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) arr[j + gap] = arr[j]; arr[j + gap] = temp; } } ```
上一篇:
Selection Sort - 选择排序
下一篇:
Merge Sort - 归并排序
该分类下的相关小册推荐:
数据结构与算法之美
数据结构与算法(上)
数据结构与算法(下)
算法面试通关 50 讲
编程之道-算法面试(下)
业务开发实用算法精讲
编程之道-算法面试(上)