3.2、动图演示
文章插图
3.3、代码实现
/** * 选择排序 * @param array * @return */public static int[] selectionSort(int[] array) { if (array.length == 0)return array; for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i; j < array.length; j++) {if (array[j] < array[minIndex]) //找到最小的数minIndex = j; //将最小数的索引保存}int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp; } return array;}3.4、算法分析
最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)
四、插入排序(Insertion Sort)插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法 。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间 。
4.1、算法描述
- 一般来说,插入排序都采用in-place在数组上实现 。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5 。
文章插图
?4.3、代码实现
/** * 插入排序 * @param array * @return */public static int[] insertionSort(int[] array) { if (array.length == 0)return array; int current; for (int i = 0; i < array.length - 1; i++) {current = array[i + 1];int preIndex = i;while (preIndex >= 0 && current < array[preIndex]) {array[preIndex + 1] = array[preIndex];preIndex--;}array[preIndex + 1] = current; } return array;}4.4、算法分析
最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n2) 平均情况:T(n) = O(n2)
五、希尔排序(Shell Sort)希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法 。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一 。它与插入排序的不同之处在于,它会优先比较距离较远的元素 。希尔排序又叫缩小增量排序 。希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止 。
5.1、算法描述
我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列 。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的 。此处我们做示例使用希尔增量 。先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序 。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度 。
5.2、过程演示
文章插图
5.3、代码实现
/** * 希尔排序 * * @param array * @return */public static int[] ShellSort(int[] array) { int len = array.length; int temp, gap = len / 2; while (gap > 0) {for (int i = gap; i < len; i++) {temp = array[i];int preIndex = i - gap;while (preIndex >= 0 && array[preIndex] > temp) {array[preIndex + gap] = array[preIndex];preIndex -= gap;}array[preIndex + gap] = temp;}gap /= 2; } return array;}5.4、算法分析
最佳情况:T(n) = O(nlog2 n) 最坏情况:T(n) = O(nlog2 n) 平均情况:T(n) =O(nlog2n)
六、归并排序(Merge Sort)和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度 。代价是需要额外的内存空间 。归并排序是建立在归并操作上的一种有效的排序算法 。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 。归并排序是一种稳定的排序方法 。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 。若将两个有序表合并成一个有序表,称为2-路归并 。
推荐阅读
- 冒泡算法和选择排序简单demo
- 奢侈冰淇淋品牌排行榜与价格 世界十大冰淇淋品牌排行榜
- 世界十大名表-世界上最贵的表
- 上海十大必游景点 上海奉贤海湾旅游区
- 世界最名贵牡丹四种谁第一 中国十大名花牡丹花简介
- 各种颜色的树 什么颜色的树木
- 吃过这些经典小吃,才算到过苏州
- 盘点世界昂贵的十大贵妇级面霜
- 最著名的定律和效应 心理学的十大效应定律
- 芝加哥十大高楼名称 芝加哥第一高楼