本文使用JavaScript完整实现了冒泡、直接插入、选择、希尔、堆、归并及快速排序等常见排序算法。详细解析了各算法的时间复杂度,如简单排序多为n²,而希尔、堆、归并和快速排序在特定条件下可达nlogn。文章提供了完整的代码示例及DEMO,帮助开发者深入理解数据结构中的排序原理与JS编码技巧。
技术迭代迅速,掌握基础知识是学习新技术的基石。为了巩固数据结构知识,本文将使用JavaScript重新实现各类排序算法,并在文末附上在线演示DEMO供参考。
简单排序算法
简单排序算法
冒泡排序
冒泡排序属于最简单的排序算法,其时间复杂度为n的平方。具体实现代码如下:
冒泡排序
function bubbleSort(array) {
for (var i = 0; i < array.length; i++) {
for (var j = array.length; j > 0; j--) {
if (array[j] < array[j - 1]) {
var temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
/* 输出结果 */
document.write("这是第 + (i + 1) + "次循环·,结果为:");
for (var k = 0; k < array.length; k++) {
document.write(array[k] + ",");
}
document.write("<br />");
/* 输出结果结束 */
}
}
直接插入排序
直接插入排序同样归类为简单排序,时间复杂度也是n的平方,但实际运行性能略优于冒泡排序。代码实现如下:
直接插入排序
function insertSort(array) {
var temp;
for (var i = 1; i < array.length; i++) {
var temp = array[i];
for (var j = i; j > 0 && temp < array[j - 1]; j--) {
array[j] = array[j - 1];
}
array[j] = temp
/* 输出结果 */
document.write("第? + i + "遍排序的结果是:")
for (var n = 0; n < array.length; n++) {
document.write(array[n] + ",");
}
document.write("<br />")
/* 输出结果结束 */
}
}
选择排序
选择排序也属于简单排序范畴,时间复杂度为n的平方,性能同样比冒泡排序稍好。相关代码如下:
选择排序
function selectSort(array) {
var min, temp; ;
for (var i = 0; i < array.length; i++) {
min = i;
for (var j = i + 1; j < array.length; j++) {
if (array[min] > array[j])
min = j;
}
if (min != i) {
temp = array[i];
array[i] = array[min];
array[min] = temp;
}
/* 输出结果 */
document.write("第 + i + "遍排序的结果是:")
for (var n = 0; n < array.length; n++) {
document.write(array[n] + ",");
}
document.write("<br />")
/* 输出结果结束 */
}
}
复杂排序算法
复杂排序算法
希尔排序
希尔排序是对插入排序的改进。1959年,希尔通过引入步长进行跳跃式比较,突破了n的平方时间复杂度限制。根据步长策略的不同,其时间复杂度范围从最优的nlogn到最坏的n的平方。代码实现如下:
希尔排序
function shallSort(array) {
var increment = array.length;
var i
var temp; //暂存
var count = 0;
do {
increment = Math.floor(increment / 3) + 1;
for (i = increment; i < array.length; i++) {
if (array[i] < array[i - increment]) {
temp = array[i];
for (var j = i - increment; j > 0 && temp < array[j]; j -= increment) {
array[j + increment] = array[j];
}
array[j + increment] = temp;
/* 输出结果 */
count++;
document.write("<br />第 + count + "遍排序的结果是:")
for (var n = 0; n < array.length; n++) {
document.write(array[n] + ",");
}
/* 输出结果结束 */
}
}
}
while (increment > 1)
}
堆排序
堆排序是选择排序的进阶版本。它通过不断构建大顶堆或小顶堆,将最大或最小值移至队列前端进行排序。无论何种情况,堆排序的时间复杂度均稳定为nlogn。代码如下:
堆排序
function heapSort(array) {
var temp;
var i;
for (i = Math.floor(array.length / 2); i >= 0; i--) {
heapAdjust(array, i, array.length - 1); //将数组array构建成一个大顶堆
}
for (i = array.length - 1; i >= 0; i--) {
/*把根节点交换出去*/
temp = array[i];
array[i] = array[0];
array[0] = temp;
/*余下的数组继续构建成大顶堆*/
heapAdjust(array, 0, i - 1);
/* 输出结果 */
document.write("<br />第 + (array.length - i).toString() + "遍排序的结果是:")
for (var n = 0; n < array.length; n++) {
document.write(array[n] + ",");
}
/* 输出结果结束 */
}
}
//要调整的子树
//start为数组开始下标
//max是数组结束下标
function heapAdjust(array, start, max) {
var temp, j;
temp = array[start];//temp是根节点的值
for (j = 2 * start; j < max; j *= 2) {
if (j < max && array[j] < array[j + 1]) { //取得较大孩子的下标
++j;
}
if (temp >= array[j])
break;
array[start] = array[j];
start = j;
}
array[start] = temp;
}
归并排序
归并排序是复杂排序中唯一稳定的排序算法。它采用分治策略,将数组拆分后再合并以完成排序。文中指出其时间复杂度为n的平方(注:通常归并排序为nlogn,此处依原文保留描述),具体代码实现如下:
归并排序
//source源数组 //dest目标数组
//s起始下标
//t目标下标
function mSort(source, dest, s, t) {
var m; //取中间值
var dest2 = new Array();
if (s == t) {
dest[s] = source[s];
}
else {
m = Math.floor((s + t) / 2);
mSort(source, dest2, s, m);
mSort(source, dest2, m+1 , t);
merge(dest2, dest, s, m, t);
/* 输出结果 */
document.write("<br />第 + ++count + "遍排序的结果是:")
for (var n = 0; n < dest.length; n++) {
document.write(array[n] + ",");
}
/* 输出结果结束 */
}
}
//将两个数组按照从小到大的顺序融合
//source原数组
//dest排序后的数组
//s第一个下标
//m第二个数组下标
//总长度
function merge(source, dest, s, m, n) {
for (var j = m+1, k = s; j <= n && s <= m; k++) {
if (source[s] < source[j]) {
dest[k] = source[s++];
}
else {
dest[k] = source[j++];
}
}
//将剩余排不完的有序数组加入到dest的末端
if (s <= m) {
for (var l = 0; l <= m - s; l++) {
dest[k + l] = source[s+l];
}
}
if (j <= n) {
for (var l = 0; l <= n - j; l++) {
dest[k + l] = source[j+l];
}
}
}
快速排序
快速排序是目前已知速度最快的排序算法之一,其时间复杂度为nlogn。实现代码如下:
快速排序
var count = 0;
function quickSort(array, low, high) {
var temp;
if (low < high) {
var keypoint = QuickSortHelp(array, low, high);
count++;
document.write("<br />第台? + count + "遍括?排?序ò的?结á果?是?:")
for (var l = 0; l < array.length; l++) {
document.write(array[l] + ",");
}
quickSort(array, low, keypoint - 1);
quickSort(array, keypoint + 1, high);
}
}
function QuickSortHelp(array, low, high) {
while (low < high) {
while (low < high && array[low] <= array[high]) {
high--;
}
temp = array[low];
array[low] = array[high];
array[high] = temp;
while (low < high && array[low] <= array[high]) {
low++
}
temp = array[low];
array[low] = array[high];
array[high] = temp;
}
return low;
}
以上关于数据结构中各种排序方法的JavaScript实现小结到此结束,希望能为读者提供参考,欢迎支持本站。