└── QuickSort.js /QuickSort.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 快速排序算法 3 | * @param {[type]} array 要排序的数组; 可以是对象数组,但必须指定第三个参数; 4 | * @param {[type]} sortType 排序类型: 'asc' 默认从小到大排序; 'desc' 从大到小排序; 5 | * @param {[type]} objectKey 如果 array 参数是对象数组,需要根据指定字段进行排序,该字段必须是数值类型; 6 | * @return {[type]} 排序后的数组 7 | */ 8 | function quickSort(array, sortType, objectKey) { 9 | 10 | // 交换元素位置 11 | function swap(array, i, k) { 12 | var temp = array[i]; 13 | array[i] = array[k]; 14 | array[k] = temp; 15 | } 16 | 17 | // 数组分区,左小右大 18 | function partition(array, left, right) { 19 | var storeIndex = left; 20 | var pivot = array[right]; // 直接选最右边的元素为基准元素 21 | for (var i = left; i < right; i++) { 22 | if (array[i] < pivot) { 23 | swap(array, storeIndex, i); 24 | storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置 25 | } 26 | } 27 | swap(array, right, storeIndex); // 将基准元素放置到最后的正确位置上 28 | return storeIndex; 29 | } 30 | 31 | // 数组分区,左大右小 32 | function partition2(array, left, right) { 33 | var storeIndex = left; 34 | var pivot = array[right]; // 直接选最右边的元素为基准元素 35 | for (var i = left; i < right; i++) { 36 | if (array[i] > pivot) { 37 | swap(array, storeIndex, i); 38 | storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置 39 | } 40 | } 41 | swap(array, right, storeIndex); // 将基准元素放置到最后的正确位置上 42 | return storeIndex; 43 | } 44 | 45 | // 对象数组分区,左小右大 46 | function partitionArrObj(array, left, right) { 47 | var storeIndex = left; 48 | var pivot = array[right][objectKey]; // 直接选最右边的元素为基准元素 49 | for (var i = left; i < right; i++) { 50 | if (array[i][objectKey] < pivot) { 51 | swap(array, storeIndex, i); 52 | storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置 53 | } 54 | } 55 | swap(array, right, storeIndex); // 将基准元素放置到最后的正确位置上 56 | return storeIndex; 57 | } 58 | 59 | // 对象数组分区,左大右小 60 | function partitionArrObj2(array, left, right) { 61 | var storeIndex = left; 62 | var pivot = array[right][objectKey]; // 直接选最右边的元素为基准元素 63 | for (var i = left; i < right; i++) { 64 | if (array[i][objectKey] > pivot) { 65 | swap(array, storeIndex, i); 66 | storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置 67 | } 68 | } 69 | swap(array, right, storeIndex); // 将基准元素放置到最后的正确位置上 70 | return storeIndex; 71 | } 72 | 73 | // 对数组进行分区,对分区后的区域再次分区,递归执行,直到左边起始点索引大于右边起始点索引; 74 | function sort(array, left, right) { 75 | if (left > right) { 76 | return; 77 | } 78 | var storeIndex; 79 | // 如果是对象数组,需要指定用来排序的字段名称 80 | if (objectKey) { 81 | if (sortType === 'desc') { 82 | storeIndex = partitionArrObj2(array, left, right); 83 | } else { 84 | storeIndex = partitionArrObj(array, left, right); 85 | } 86 | } else { // 数值数组 87 | if (sortType === 'desc') { 88 | storeIndex = partition2(array, left, right); 89 | } else { 90 | storeIndex = partition(array, left, right); 91 | } 92 | } 93 | sort(array, left, storeIndex - 1); 94 | sort(array, storeIndex + 1, right); 95 | } 96 | // 开始排序 97 | sort(array, 0, array.length - 1); 98 | // 返回结果 99 | return array; 100 | } 101 | 102 | 103 | /** 104 | * 使用示例 105 | */ 106 | 107 | var arr = [3, 51, 7, 15, 4, 9, 12, 33, 2, 9, 11]; 108 | console.log(quickSort(arr)); // 默认,从小到大排序 109 | console.log(quickSort(arr, 'desc')); // 从大到小排序 110 | 111 | var arrObj = [ 112 | { id: 1, nb: 3 }, 113 | { id: 2, nb: 51 }, 114 | { id: 3, nb: 7 }, 115 | { id: 4, nb: 15 }, 116 | { id: 5, nb: 4 }, 117 | { id: 6, nb: 9 }, 118 | { id: 7, nb: 12 } 119 | ]; 120 | console.log(quickSort(arrObj, 'asc', 'nb')); 121 | console.log(quickSort(arrObj, 'desc', 'nb')); --------------------------------------------------------------------------------