Open cloudtian opened 3 years ago
归并排序的迭代方式实现
// 用迭代方式改写递归函数
function mregeSort(arr) {
if (arr.length === 1) return arr;
const len = arr.length;
const work = [];
for (let i = 0;i<len;i++) {
work.push([array[i]]);
}
// 确保总数组长度为偶数
if (len & 1) work.push([]);
// 迭代两两归并
for(let lim = len;lim > 1;lim = (lim+1)/2) {
for(let j=0,k=0;k<lim;j+=1,k+=2) {
work[j] = merge(work[k],work[k+1]);
}
// 数组长度为奇数时,补一个空数组
if (lim&1) work[j]=[];
}
return work[0];
}
冒泡排序
步骤思路
时间复杂度
稳定性
冒泡排序是把小的元素往前排或大的元素往后排。比较的是相邻的两个元素,交换也发生在相邻两个元素之间。
所以,如果两个元素相等,是不会交换的。即使两个相等的元素没有相邻,通过两两交换后也不会对这两个元素交换。
所以,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定的排序算法。
代码实现及流程图
冒泡排序的优化
快速排序
步骤思路
时间复杂度
在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较。
一次划分需要算法时间复杂度是O(n),
理想情况下,每次划分将序列几乎等分,需要经过log2n趟划分便可得到长度为1的子表。整个算法的事件复杂度为Ο(nlog2n)。
最坏状况下,每次划分所得子表一个为空表,一个为原长度-1。这样需要划分n趟,时间复杂度为Ο(n^2)。
为了改善最坏情况,可以采用其他方法选取中间数。通常采用“三者值取中”方法。
快速排序平均时间复杂度为Ο(nlog2n),被认为是目前最好的一种内部排序方法。
稳定性
快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
代码实现及流程图
插入排序
步骤思路
时间复杂度
稳定性
如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即他们的位置保持不变。
关键词相同的数据元素将保持原有位置不变,所以该算法是稳定的。
代码实现及流程图
选择排序
步骤思路
时间复杂度
稳定性
在一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
如: [5 8 5 2 9],第一遍选择第一个5会和2交换,那么原序列中的两个5的相对前后顺序就被破坏力。 所以选择排序是一个不稳定的排序算法。
代码实现与流程图
归并排序
步骤
复杂度
归并排序比较占用内存,但却是一种效率高且稳定的算法。
稳定性
归并排序是稳定的排序,即相等的元素的顺序不会改变。 这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其他信息尽量按输入的顺序排列时很重要。
代码实现
几种排序算法比较