JavaScript数据结构-2.排序算法

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>js数据结构相关</title>
  6 </head>
  7 <body>
  8     <script>
  9 
 10         //快速排序法
 11        function quick_sort(arr){
 12            function sort(pre,end) {
 13                var k = arr[pre],i=pre,j=end-1;
 14              if ((end-pre) > 1) {
 15                while (i < j) {
 16                    for (;i<j;j--) {
 17                        if (arr[j] < k) {
 18                            arr[i++] = arr[j];
 19                            break;
 20                        }
 21                    }
 22                    for (; i < j; i++) {
 23                        if (arr[i] > k) {
 24                            arr[j--] = arr[i];
 25                            break;
 26                        }
 27                    }
 28                }
 29 
 30                    arr[i] = k;
 31                    sort(0, i);
 32                    sort(i + 1, end);
 33 
 34             }
 35            }
 36            sort(0,arr.length);
 37            return arr;
 38        }
 39 
 40       console.log(quick_sort([5,2,9,8,7,3,6,4,0,1]));
 41        console.log(quickSort([5,2,9,8,7,3,6,4,0,1]));
 42 
 43 
 44         //  快速排序法
 45        function quickSort(array){
 46            function sort(prev, numsize){
 47                var nonius = prev;
 48                var j = numsize -1;
 49                var flag = array[prev];
 50                if ((numsize - prev) > 1) {
 51                    while(nonius < j){
 52                        for(; nonius < j; j--){
 53                            if (array[j] < flag) {
 54                                array[nonius++] = array[j]; //a[i] = a[j]; i += 1;
 55                                break;
 56                            };
 57                        }
 58                        for( ; nonius < j; nonius++){
 59                            if (array[nonius] > flag){
 60                                array[j--] = array[nonius];
 61                                break;
 62                            }
 63                        }
 64                    }
 65                    array[nonius] = flag;
 66                    sort(0, nonius);
 67                    sort(nonius + 1, numsize);
 68                }
 69            }
 70            sort(0, array.length);
 71            return array;
 72        }
 73 
 74         //归并排序法
 75 
 76         function mergeSort(arr){   // 自上而下的递归方法
 77             var  len = arr.length;
 78             if(len<2){
 79                 return arr;
 80             }
 81 
 82             var middle = Math.floor(len /2),
 83                 left = arr.slice(0,middle),
 84                 right = arr.slice(middle);
 85 
 86             return merge(mergeSort(left),mergeSort(right));
 87         }
 88         function merge(left,right){
 89             var result = [];
 90             while(left.length && right.length){
 91                 if(left[0] <= right[0]){
 92                     result.push(left.shift())
 93                 }else{
 94                     result.push(right.shift());
 95                 }
 96             }
 97 
 98 
 99             while(left.length){
100                 result.push(left.shift());
101             }
102             while(right.length){
103                 result.push(right.shift());
104             }
105             return result;
106         }
107         console.log(mergeSort([5,2,9,8,7,3,6,4,0,1]));
108 
109 
110         //归并排序对数组内对象的属性进行排序
111 
112         var merge_Sort = (function() {
113             // 合并
114             var _merge = function(left, right, prop) {
115                 var result = [];
116 
117                 // 对数组内成员的某个属性排序
118                 if (prop) {
119                     while (left.length && right.length) {
120                         if (left[0][prop] <= right[0][prop]) {
121                             result.push(left.shift());
122                         } else {
123                             result.push(right.shift());
124                         }
125                     }
126                 } else {
127                     // 数组成员直接排序
128                     while (left.length && right.length) {
129                         if (left[0] <= right[0]) {
130                             result.push(left.shift());
131                         } else {
132                             result.push(right.shift());
133                         }
134                     }
135                 }
136 
137                 while (left.length)
138                     result.push(left.shift());
139 
140                 while (right.length)
141                     result.push(right.shift());
142 
143                 return result;
144             };
145 
146             var _mergeSort = function(arr, prop) { // 采用自上而下的递归方法
147                 var len = arr.length;
148                 if (len < 2) {
149                     return arr;
150                 }
151                 var middle = Math.floor(len / 2),
152                         left = arr.slice(0, middle),
153                         right = arr.slice(middle);
154                 return _merge(_mergeSort(left, prop), _mergeSort(right, prop), prop);
155             };
156 
157             return function(arr, prop, order) {
158                 var result = _mergeSort(arr, prop);
159                 if (!order || order.toLowerCase() === 'asc') {
160                     // 升序
161                     return result;
162                 } else {
163                     // 降序
164                     var _ = [];
165                     result.forEach(function(item) {
166                         _.unshift(item);
167                     });
168                     return _;
169                 }
170             };
171         })();
172         var arr = [{"name":"zhangsan","age":19},{"name":"lisi","age":20},{"name":"wangwu","age":15},{"name":"wangwu","age":14},{"name":"wangwu","age":17}]
173        console.log(merge_Sort(arr,"age"));
174 
175 
176 
177         //插入排序
178 
179         function insertSort(arr){
180             var len =arr.length,preIndex,current;
181             for(var i=1;i<len;i++){
182                 preIndex = i-1;
183                 current = arr[i];
184                 while(preIndex >=0 && arr[preIndex] >current){
185                     arr[preIndex+1] = arr[preIndex];
186                     preIndex--;
187                 }
188                 arr[preIndex+1] = current;
189             }
190             return arr;
191         }
192       console.log(insertSort([5,2,9,8,7,3,6,4,0,1]))
193         //时间复杂度来说, 插入,冒泡,选择排序都在  n^2 ,希尔,归并,快速排序
194         // 堆排序都在n*log n,  计数排序,桶排序是n+k,基数排序是n*k;
195         //作为常用算法,归并要比快速排序稳定。
196     </script>
197 </body>
198 </html>

 

posted @ 2017-07-16 21:20  橙云生  阅读(160)  评论(0编辑  收藏  举报