javascript数据结构9-排序

来源:互联网 发布:万网二手域名交易平台 编辑:程序博客网 时间:2024/06/05 17:13

排序算法
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>
0 0
原创粉丝点击