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>