文章插图
作者:神奇的程序员K
转发链接:https://mp.weixin.qq.com/s/3B8dZRfbIuktSBeArXlmcQ
前言我们在页面上渲染数据时,通常会根据特定规则来对数据进行一个排序,然后再将其渲染到页面展示给用户 。哪么对数据进行排序有很多种方式,哪一种效率高?哪一种稳定性好?那一种占用内存小?本文将详解经典的八大排序算法以及三种搜索算法,并用TypeScript将其实现,欢迎各位对上述问题迷惑的开发者阅读本文 。
排序算法我们先来学习下排序算法,八大排序包括:冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、同排序、基数排序其中有几个排序我在之前的文章中已经讲解了其图解实现,本文将注重讲解其实现,另外几篇文章链接如下:
- 排序算法:冒泡排序
- 排序算法:选择排序
- 排序算法:插入排序
- 排序算法:归并排序
- 排序算法:快速排序
实现思路它会比较相邻的两个项,如果第一个比第二个大,则交换它们 。元素项向上移动至正确的顺序 。为了让排序算法更灵活,不仅仅只是用于数字的排序,因此本文中讲解的排序算法都会有一个比对函数作为参数传进来,用于定义两个值的比较方式 。
- 声明一个函数其接受两个参数:待排序数组 & 比对函数
- 第一层循环i:从待排序数组的0号元素开始遍历数组,遍历到最后一位,用于控制数组需要经过多少轮排序
- 第二层循环j:从数组的0号元素开始遍历,遍历至数组的倒数第二位元素再减去第一层循环i 。
- 比较大小,在第二层循环中,将当前遍历到的元素和其下一个元素比较大小,如果 j > j + 1就交换两个元素的位置 。
实现代码为了让函数便于维护,我们新建一个类名为Sort,本文中实现的所有函数都为这个类内部的方法 。
- 为了函数的可扩展性,我们需要实现一个默认的比对函数,此比对函数作用于本文中的所有排序方法
export function defaultCompare<T>(a: T, b: T): number { if (a === b) { return Compare.EQUALS; } else if (a > b) { return Compare.BIGGER_THAN; } else { return Compare.LESS_THAN; }}// 枚举类:定义比对返回值export enum Compare { LESS_THAN = -1, BIGGER_THAN = 1, EQUALS = 0}
- 在类中声明需要的变量,并在构造器中声明需要传的参数类型,此处适用于本文实现的所有函数
/** * 排序算法 * @param array 需要进行排序的数组 * @param compareFn 比对函数 */ constructor(private array: T[] = [], private compareFn: ICompareFunction<T> = defaultCompare) {}
- 实现冒泡排序
// 冒泡排序 bubbleSort(): void { // 获取数组长度 const { length } = this.array; for (let i = 0; i < length; i++) { // 从数组的0号元素遍历到数组的倒数第2号元素,然后减去外层已经遍历的轮数 for (let j = 0; j < length - 1 - i; j++) { // 如果j > j + 1位置的元素就交换他们两个元素的位置 if (this.compareFn(this.array[j], this.array[j + 1]) === Compare.BIGGER_THAN) { this.swap(this.array, j, j + 1); } } } }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pytorch实现 GoogLeNet——CNN经典网络模型详解
- Python实现数据压缩如此简单
- 抗战时期三八大盖射程多少米
- 欧阳修是唐宋什么八大家之一
- Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
- 教你用10行Python 代码实现自动化群控
- 满族人都姓爱新觉罗吗 满清八大姓氏为什么没有爱新觉罗
- 中老年耳背会遗传吗?
- 使用Swoole协程实现 WebRTC 信令服务器
- 中国八大古都是哪个城市?