javascript数据结构9-排序

本文详细介绍五种排序算法:冒泡排序、选择排序、插入排序、希尔排序及快速排序。每种算法都附带实例代码,便于理解其工作原理及执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法
1. 基本排序
- 冒泡排序
- 选择排序
- 插入排序
2. 高级排序
- 希尔排序
- 归并排序
- 快速排序
- 基数排序 (见【Javascript】四、JS数据结构-队列2-基数排序)

注释:完整例子在最后,可以copy运行。
测试数据平台:

 //数组平台
    function CArray(numElements) {
        this.dataStore = [];
        this.pos = 0;
        this.numElements = numElements;
        this.insert = insert;
        this.toString = toString;
        this.clear = clear;
        this.setData = setData;
        this.swap = swap;
        for (var i = 0; i < numElements; ++i) {
            this.dataStore[i] = i;
        }

        //排序算法
        this.bubbleSort = bubbleSort; //冒泡排序
        this.selectionSort = selectionSort; //选择排序
        this.insertionSort = insertionSort; //插入排序
        this.shellSort = shellSort; //希尔排序
        this.gaps = [5, 3, 1];
    }

    function setData() {
        for (var i = 0; i < this.numElements; ++i) {
            this.dataStore[i] = Math.floor(Math.random() * (this.numElements + 1));
        }
    }

    function clear() {
        for (var i = 0; i < this.dataStore.length; ++i) {
            this.dataStore[i] = 0;
        }
    }

    function insert(element) {
        this.dataStore[this.pos++] = element;
    }

    function toString() {
        var retstr = "";
        for (var i = 0; i < this.dataStore.length; ++i) {
            retstr += this.dataStore[i] + " ";
            if (i > 0 & i % 10 == 0) {
                retstr += "<br/>";
            }
        }
        return retstr;
    }

    function swap(arr, index1, index2) {
        var temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

1-冒泡排序

//基本排序算法
    //1-冒泡排序  时间复杂度 n2
    function bubbleSort() {
        var numElements = this.dataStore.length;
        var temp;
        for (var i = numElements; i >= 2; --i) {
            for (var j = 0; j <= i - 1; ++j) {
                if (this.dataStore[j] > this.dataStore[j + 1]) {
                    swap(this.dataStore, j, j + 1);
                }
            }
            document.write(this.toString());
            document.write('<br/>');
        }
    }

    function bubbleSortTest(numElements) {
        // var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>冒泡排序过程:【最大的先冒出来排在最后一位】<br/>');
        var start = new Date().getTime();
        myNums.bubbleSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
        //document.write(myNums.toString());
    }

2-选择排序

//2-选择排序
    function selectionSort() {
        var min, temp;
        for (var i = 0; i <= this.dataStore.length - 2; ++i) {
            min = i;
            for (var j = i + 1; j <= this.dataStore.length - 1; ++j) {
                if (this.dataStore[j] < this.dataStore[min]) {
                    min = j;
                }
            }
            swap(this.dataStore, i, min);
            document.write(this.toString());
            document.write('<br/>');
        }
    }

    function selectionSortTest(numElements) {
        //var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>选择排序过程:【最小的选择出来放在第一位】<br/>');
        var start = new Date().getTime();
        myNums.selectionSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
        //document.write(myNums.toString());
    }

3-插入排序

 //3-插入排序
    function insertionSort() {
        var temp, j;
        for (var i = 1; i <= this.dataStore.length - 1; ++i) {
            temp = this.dataStore[i];
            j = i; //j=1
            while (j > 0 && (this.dataStore[j - 1] > temp)) {
                this.dataStore[j] = this.dataStore[j - 1];
                --j;
            }
            this.dataStore[j] = temp;
            document.write(this.toString());
            document.write('<br/>');
        }

    }

    function insertionSortTest(numElements) {
        //var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>插入排序过程:【从首位开始一个一个插入比较】<br/>');
        var start = new Date().getTime();
        myNums.insertionSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
    }

4-希尔排序

//高级排序算法
    //4-shell排序
    function shellSort() {
        //gaps的长度,分为三大步
        for (var g = 0; g < this.gaps.length; ++g) { //3层 
            for (var i = this.gaps[g]; i < this.dataStore.length; ++i) {
                var temp = this.dataStore[i];
                for (var j = i; j >= this.gaps[g] && this.dataStore[j - this.gaps[g]] > temp; j -= this.gaps[g]) { //第一次循环:j=5 如果第1个数【序号0】 > 第6个数【temp序号5】
                    this.dataStore[j] = this.dataStore[j - this.gaps[g]]; //第一次循环j=5  那么第6个数【序号5】 = 第1个数【序号0】
                    //小的排在前面
                }
                this.dataStore[j] = temp;

            }
            document.write(this.toString());
            document.write('<br/>');
        }

    }

    function shellSortTest(numElements) {
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>希尔排序过程:<br/>');
        var start = new Date().getTime();
        myNums.shellSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write('排序结果是:<br/>');
        document.write(myNums.toString());
        document.write('<br/>');
        document.write("所需要的时间是:" + time);
    }

5-快速排序

 //5-快速排序
    function qSort(arr) {
        if (arr.length == 0) {
            return [];
        }
        var left = [];
        var right = [];
        var pivot = arr[0];
        for (var i = 1; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return qSort(left).concat(pivot, qSort(right));
    }

    function qSortTest(numElements) {
        var a = [];
        for (var i = 0; i < numElements; i++) {
            a[i] = Math.floor((Math.random() * numElements) + 1);
        }
        document.write(a);
        document.write('<br/>');
        var start= new Date().getTime();
        document.write(qSort(a));
        document.write("<br/>需要时间是:");
        var stop= new Date().getTime();
        var time=stop-start;
        document.write(time);
    }

完整例子:

<!DOCTYPE html>
<html>
<meta charset="utf-8">

<head>
    <title>排序算法总结</title>
</head>

<body>
    <input type="button" value="冒泡排序过程查看" onclick="bubbleSortTest(10)">
    <input type="button" value="选择排序过程查看" onclick="selectionSortTest(10)">
    <input type="button" value="插入排序过程查看" onclick="insertionSortTest(10)">
    <input type="button" value="希尔排序过程查看" onclick="shellSortTest(10)">
    <input type="button" value="快速排序过程查看" onclick="qSortTest(10)">
    <br/>
    <p>查看执行函数,建议先删除排序函数中的document.write过程打印,即是:</p>
    <input type="button" value="冒泡排序执行时间" onclick="bubbleSortTest(10000)">
    <input type="button" value="选择排序执行时间" onclick="selectionSortTest(10000)">
    <input type="button" value="插入排序执行时间" onclick="insertionSortTest(10000)">
    <input type="button" value="希尔排序执行时间" onclick="shellSortTest(10000)">
    <input type="button" value="快速排序执行时间" onclick="qSortTest(10000)">
    <script type="text/javascript">
    //===========================================
    //数组平台
    function CArray(numElements) {
        this.dataStore = [];
        this.pos = 0;
        this.numElements = numElements;
        this.insert = insert;
        this.toString = toString;
        this.clear = clear;
        this.setData = setData;
        this.swap = swap;
        for (var i = 0; i < numElements; ++i) {
            this.dataStore[i] = i;
        }

        //排序算法
        this.bubbleSort = bubbleSort; //冒泡排序
        this.selectionSort = selectionSort; //选择排序
        this.insertionSort = insertionSort; //插入排序
        this.shellSort = shellSort; //希尔排序
        this.gaps = [5, 3, 1];
    }

    function setData() {
        for (var i = 0; i < this.numElements; ++i) {
            this.dataStore[i] = Math.floor(Math.random() * (this.numElements + 1));
        }
    }

    function clear() {
        for (var i = 0; i < this.dataStore.length; ++i) {
            this.dataStore[i] = 0;
        }
    }

    function insert(element) {
        this.dataStore[this.pos++] = element;
    }

    function toString() {
        var retstr = "";
        for (var i = 0; i < this.dataStore.length; ++i) {
            retstr += this.dataStore[i] + " ";
            if (i > 0 & i % 10 == 0) {
                retstr += "<br/>";
            }
        }
        return retstr;
    }

    function swap(arr, index1, index2) {
        var temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
    //使用测试平台类

    //=================================================================
    //基本排序算法
    //1-冒泡排序  时间复杂度 n2
    function bubbleSort() {
        var numElements = this.dataStore.length;
        var temp;
        for (var i = numElements; i >= 2; --i) {
            for (var j = 0; j <= i - 1; ++j) {
                if (this.dataStore[j] > this.dataStore[j + 1]) {
                    swap(this.dataStore, j, j + 1);
                }
            }
            document.write(this.toString());
            document.write('<br/>');
        }
    }

    function bubbleSortTest(numElements) {
        // var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>冒泡排序过程:【最大的先冒出来排在最后一位】<br/>');
        var start = new Date().getTime();
        myNums.bubbleSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
        //document.write(myNums.toString());
    }
    //2-选择排序
    function selectionSort() {
        var min, temp;
        for (var i = 0; i <= this.dataStore.length - 2; ++i) {
            min = i;
            for (var j = i + 1; j <= this.dataStore.length - 1; ++j) {
                if (this.dataStore[j] < this.dataStore[min]) {
                    min = j;
                }
            }
            swap(this.dataStore, i, min);
            document.write(this.toString());
            document.write('<br/>');
        }
    }

    function selectionSortTest(numElements) {
        //var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>选择排序过程:【最小的选择出来放在第一位】<br/>');
        var start = new Date().getTime();
        myNums.selectionSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
        //document.write(myNums.toString());
    }

    //3-插入排序
    function insertionSort() {
        var temp, j;
        for (var i = 1; i <= this.dataStore.length - 1; ++i) {
            temp = this.dataStore[i];
            j = i; //j=1
            while (j > 0 && (this.dataStore[j - 1] > temp)) {
                this.dataStore[j] = this.dataStore[j - 1];
                --j;
            }
            this.dataStore[j] = temp;
            document.write(this.toString());
            document.write('<br/>');
        }

    }

    function insertionSortTest(numElements) {
        //var numElements = 10;
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>插入排序过程:【从首位开始一个一个插入比较】<br/>');
        var start = new Date().getTime();
        myNums.insertionSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write("所需要的时间是:" + time);
    }
    //高级排序算法
    //4-shell排序
    function shellSort() {
        //gaps的长度,分为三大步
        for (var g = 0; g < this.gaps.length; ++g) { //3层 
            for (var i = this.gaps[g]; i < this.dataStore.length; ++i) {
                var temp = this.dataStore[i];
                for (var j = i; j >= this.gaps[g] && this.dataStore[j - this.gaps[g]] > temp; j -= this.gaps[g]) { //第一次循环:j=5 如果第1个数【序号0】 > 第6个数【temp序号5】
                    this.dataStore[j] = this.dataStore[j - this.gaps[g]]; //第一次循环j=5  那么第6个数【序号5】 = 第1个数【序号0】
                    //小的排在前面
                }
                this.dataStore[j] = temp;

            }
            document.write(this.toString());
            document.write('<br/>');
        }

    }

    function shellSortTest(numElements) {
        var myNums = new CArray(numElements);
        myNums.setData();
        document.write(myNums.toString());
        document.write('<br/>希尔排序过程:<br/>');
        var start = new Date().getTime();
        myNums.shellSort();
        var stop = new Date().getTime();
        var time = stop - start;
        document.write('排序结果是:<br/>');
        document.write(myNums.toString());
        document.write('<br/>');
        document.write("所需要的时间是:" + time);
    }

    //5-快速排序
    function qSort(arr) {
        if (arr.length == 0) {
            return [];
        }
        var left = [];
        var right = [];
        var pivot = arr[0];
        for (var i = 1; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return qSort(left).concat(pivot, qSort(right));
    }

    function qSortTest(numElements) {
        var a = [];
        for (var i = 0; i < numElements; i++) {
            a[i] = Math.floor((Math.random() * numElements) + 1);
        }
        document.write(a);
        document.write('<br/>');
        var start= new Date().getTime();
        document.write(qSort(a));
        document.write("<br/>需要时间是:");
        var stop= new Date().getTime();
        var time=stop-start;
        document.write(time);
    }
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值