手撕代码必须会的东西。。。结果希尔排序没写出来,太尴尬了。
1.快速排序
取一个中间的基准值,小的值放在左边的数组,大的值放在右边的数组,最后递归并拼接数组。
function quickSort(arr){
if(arr.length<=1){
return arr;
}
var baseIndex = Math.floor(arr.length / 2); //获取基准点位置
var base = arr.splice(baseIndex, 1)[0]; //获取基准点索引
var left = [];
var right = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] < base){
left.push(arr[i]);
}else {
right.push(arr[i]);
}
}
return quickSort(left).concat([base], quickSort(right));
}
2.冒泡排序
相邻元素比较,找出最小值冒泡到首位,不断循环完成排序。
function bubbleSort(arr){
for(var i = 0; i < arr.length; i++){
for(var j = 0; j < arr.length-i-1; j++){
if(arr[j] > arr[j+1]){ //相邻元素比较
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
}
}
}
return arr;
}
3.选择排序
循环找出最小元素与首位元素交换次序直到最大元素。
function selectSort(arr) {
for(var i = 0; i < arr.length; i++){
for(var j = i + 1; j < arr. length; j++){
if(arr[i] > arr[j]){
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
}
return arr;
}
4.插入排序
以第一个元素为有序数组,其后的元素在该数组中找到合适的位置插入。
function insertSort(arr) {
var len = arr.length;
for(var i = 1; i < len; i++){
var temp = arr[i];
var j = i - 1;
while(arr[j] > temp){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
return arr;
}
5.希尔排序
按一定的间隔对数列进行分组,然后在每一个分组中做插入排序;随后逐次缩小间隔,在每一个分组中做插入排序,直到间隔等于1,做一次插入排序后结束。
function shellSort(arr) {
var len = arr.length;
var h = 1;
while (h < len / 3) {
h = 3 * h + 1; //设置间隔
}
while (h >= 1) {
for (var i = h; i < len; i++) {
for (j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
swap(arr, j, j - h);
}
}
h = (h - 1) / 3;
}
}
function swap(array, i, j) { //两个数调换
var temp = array[j];
array[j] = array[i];
array[i] = temp;
}
6.归并排序
采用分治思想,将数组反复二分为两个小数组,直到每个数组只有一个元素,从最小的数组开始,两两顺序合并。
function mergeSort(arr) {
var len = arr.length;
if(len < 2) return arr;
var mid = Math.floor(len / 2),
left = arr.slice(0, mid),
right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var res = [];
while(left.length > 0 && right.length > 0){
if(left[0] <= right[0]){
res.push(left.shift());
}else{
res.push(right.shift());
}
}
while(left.length)
res.push(left.shift());
while(right.length)
res.push(right.shift());
return res;
}
7.计数排序
使用一个额外的计数数组bucket,其中第 i 个元素是待排序数组 arr 中值等于 i 的元素的个数。然后根据数组 bucket 来将 arr 中的元素排到正确的位置。
function countingSort(arr, max) {
var bucket = new Array(max+1),
index = 0;
var len = arr.length,
bucketLen = max + 1;
for (var i = 0; i < len; i++) {
if (!bucket[arr[i]]) { //若计数缓存中无此数,则置0
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
}
for (var j = 0; j < bucketLen; j++) {
while(bucket[j] > 0) { //找到计数缓存中非0的项放在原数组中
arr[index++] = j;
bucket[j]--;
}
}
return arr;
}