几种典型的排序算法

  1 // 冒泡排序
  2     function swap(myArr, a, b) {
  3         var temp = myArr[a];
  4         myArr[a] = myArr[b];
  5         myArr[b] = temp;
  6     }
  7     function bubbleSort(myArr) {
  8         var len = myArr.length,
  9                 i, j,stop;
 10         for (i = 0; i < len; i++) {
 11             for (j = 0, stop = len - 1 - i; j < stop; j++) {
 12                 if (myArr[j] > myArr[j + 1]) {
 13                     swap(myArr, myArr[j], myArr[j + 1]);
 14                 }
 15             }
 16         }
 17         return myArr;
 18     }
 19 
 20     // 选择排序
 21     function selectionSort(myArr) {
 22         var len = myArr.length,
 23                 min;
 24         for (var i = 0; i < len; i++) {
 25             // 将当前值设为最小值
 26             min = i;
 27             // 检查数组其余部分是否更小
 28             for (var j = i + 1; j < len; j++) {
 29                 if (myArr[j] < myArr[min]) {
 30                     min = j;
 31                 }
 32             }
 33 
 34             // 如果当前位置不是最小值,将其替换为最小值
 35             if (i != min) {
 36                 swap(myArr, i, min);
 37             }
 38         }
 39         return myArr;
 40     }
 41 
 42     // 插入排序
 43     function insertionSort(myArr) {
 44         var len = myArr.length,
 45                 value, // 当前比较的值
 46                 i, // 未排序部分的当前位置
 47                 j; // 已排序部分的当前位置
 48         for (i = 0; i < len; i++) {
 49             // 储存当前位置的值
 50             value = myArr[i];
 51             // 当已排序部分的当前元素大于value,
 52             // 就将当前元素后移一位,再将前一位与value比较
 53             for (j = i - 1; j > -1 && myArr[j] > value; j++) {
 54                 myArr[j + 1] = myArr[j];
 55             }
 56             myArr[j + 1] = value;
 57         }
 58         return myArr;
 59     }
 60 
 61     // 合并排序
 62     function merge(left, right) {
 63         var result = [],
 64                 il,
 65                 ir;
 66         while (il < left.length && ir < right.length) {
 67             if (left[il] < right[ir]) {
 68                 result.push(left[il++]);
 69             } else {
 70                 result.push(right[ir++]);
 71             }
 72         }
 73         return result.concat(left.slice(il)).concat(right.slice(ir));
 74     }
 75 
 76     function mergeSort(myArr) {
 77         if (myArr.length < 2) {return myArr;}
 78 
 79         var middle = Math.floor(myArr.length / 2),
 80                 left = myArr.slice(0, middle),
 81                 right = myArr.slice(middle),
 82                 params = merge(mergeSort(left), mergeSort(right));
 83 
 84         // 在返回的数组头部添加0和数组长度两个元素
 85         params.unshift(0, myArr.length);
 86 
 87         // 讲原来的数组替换为排序后的数组
 88         myArr.splice.apply(myArr, params);
 89 
 90         return myArr;
 91     }
 92 
 93     // 快速排序
 94     function swapN(myArr, firstIndex, secondIndex) {
 95         var temp = myArr[firstIndex];
 96         myArr[firstIndex] = myArr[secondIndex];
 97         myArr[secondIndex] = temp;
 98     }
 99 
100     function patition(myArr, left, right) {
101         var pivot = myArr[Math.floor((left + right) / 2)],
102                 i = left,
103                 j = right;
104         while (i <= j) {
105             while (myArr[i] < pivot) {
106                 i++;
107             }
108             while (myArr[j] > pivot) {
109                 j--;
110             }
111             if (i <= j) {
112                 swapN(myArr, i, j);
113                 i++;
114                 j++;
115             }
116         }
117         return i;
118     }
119 
120     function quickSort(myArr, left, right) {
121         if (myArr.length < 2) return myArr;
122 
123         left = (typeof left !== 'number' ? 0 : left);
124         right = (typeof right !== 'number' ? myArr.length - 1 : right);
125 
126         var index = patition(myArr, left, right);
127 
128         if (left < index - 1) {
129             quickSort(myArr, left, index - 1);
130         }
131         if (index < right) {
132             quickSort(myArr, index, right);
133         }
134         return myArr;
135     }

摘自阮一峰老师网站。

posted @ 2016-06-01 18:09  chauvet  阅读(537)  评论(0编辑  收藏  举报