冒泡排序(Bubble Sort)

function bubbleSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    let flag;	
    let temp;
    for (let i = 0; i < arr.length; i++) {
        flag = true;
        for (let j = 0; j < arr.length - 1 - i; j++) {	// 内层循环
            if (arr[j] > arr[j + 1]) {	// 比较相邻两个值
                flag = false;
                temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
        if (flag) {	// 如果flag为true,表示上轮循环已经有序
            return arr;
        }
    }
}

快速排序(Quicksort)

function QuickSort(arr, low, high) {
    let temp;
    let i = low,
        j = high;
    if (low < high) {
        temp = arr[low];
        while (i < j) {
            while (j > i && arr[j] >= temp) {
                j--;
            }
            while (i < j && arr[i] <= temp) {
                i++;
            }
            if (i < j) {
                let t = arr[i];
                arr[i] = arr[j]; //放在temp右边
                arr[j] = t;
            }
        }
        //最终将基准数归位
        arr[low] = arr[i];
        arr[i] = temp;
        QuickSort(arr, low, i - 1);
        QuickSort(arr, i + 1, high);
    }
}

另一种写法

function QuickSort(arr, low, high) {
    let temp;
    let i = low, j = high;
    if(low < high) {
        temp = arr[low];
        while(i < j) {
            while(j > i && arr[j] >= temp) {
                j--;
            }
            if(i<j) {
                arr[i] = arr[j];
                i++;
            }
            while(i < j && arr[i] < temp) {
                i++;
            }
            if(i<j)
            {
                arr[j]=arr[i];	//放在temp右边
                --j;	//j左移一位
            }
        }
        arr[i] = temp;
        QuickSort(arr, low, i-1);
        QuickSort(arr, i+1, high);
    }
}

选择排序

function selectSort(arr) {
    for (let i = 0; i < arr.length; i++) {
        let min = arr[i];
        let index = i;
        for (let j = i + 1; j < arr.length; j++) {
            if (min > arr[j]) {
                min = arr[j];
                index = j;
            }
        }
        arr[index] = arr[i];
        arr[i] = min;
    }
}

插入排序

function insertionSort(arr) {
    for (let i = 1; i < arr.length; i++) {
        let temp = arr[i];
        let j = i - 1;
        while (temp < arr[j] && j >= 0) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = temp;
    }
}

堆排序

Array.prototype.heap_sort = function() {
	var arr = this.slice(0);
	function swap(i, j) {
		var tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	function max_heapify(start, end) {
		//建立父節點指標和子節點指標
		var dad = start;
		var son = dad * 2 + 1;
		if (son >= end)//若子節點指標超過範圍直接跳出函數
			return;
		if (son + 1 < end && arr[son] < arr[son + 1])//先比較兩個子節點大小,選擇最大的
			son++;
		if (arr[dad] <= arr[son]) {//如果父節點小於子節點時,交換父子內容再繼續子節點和孫節點比較
			swap(dad, son);
			max_heapify(son, end);
		}
	}

	var len = arr.length;
	//初始化,i從最後一個父節點開始調整
	for (var i = Math.floor(len / 2) - 1; i >= 0; i--)
		max_heapify(i, len);
	//先將第一個元素和已排好元素前一位做交換,再從新調整,直到排序完畢
	for (var i = len - 1; i > 0; i--) {
		swap(0, i);
		max_heapify(0, i);
	}

	return arr;
};
var a = [3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6];
console.log(a.heap_sort());

归并排序

function merge(left, right){
    var result = [];
    while(left.length > 0 && right.length > 0){
      if(left[0] < right[0]){
        result.push(left.shift());
      }else{
        result.push(right.shift());
      }
    }
    return result.concat(left, right);
  }
  
  function mergeSort(arr){
    if(arr.length <=1) return arr;
    var middle = Math.floor(arr.length / 2);
    var left = arr.slice(0, middle);
    var right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
  }

  console.log(mergeSort([1,2,4,51,22,1,53,5,2,5,3,111,3]));

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

正则表达式 上一篇
浅拷贝与深拷贝 下一篇