1. 程式人生 > >幾種簡單的排序演算法

幾種簡單的排序演算法

1.向上氣泡排序

var len = arr.length;
for (var i = 0; i < len - 1; i++) { //比較趟數;
  for (var j = len - 1; j > i; j--) { //比較次數
	if (arr[j] > arr[j - 1]) {    //降序
	  [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
	}
  }
}

2.選擇排序

未排序部分是整個陣列, 已排序部分是空的 找最值(最大或最小)

var len = arr.length;
for(let i = 0; i < len - 1; i++) {
  let minIndex = i;
    for (let j = i + 1; j < len; j++) {
	  if (arr[j] < arr[minIndex]) {
		minIndex = j; //先和一個基值比較,找到最大或最小值後存其索引;
	  }
	}
  [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}

3.插入排序

已排序部分:視為有一個初始值,
未排序部分:依次從裡面取值到已排序部分,進行從後向前的比較,如果已排序部分大於待排序部分
繼續向前,值到已排序部分有第一個比他小的數,就把待排序數插入到這個值後面。

for (var i = 1; i < len; i++) { //迴圈待排序部分
	var c = arr[i]; //存待排序值 
	// 	for (var j = i - 1; j >= 0; j--) {//與已排序部分進行比較
	// 		if (arr[j] > c) {
	// 			arr[j + 1] = arr[j];
	// 	} else {
	// 		break;
	// 	  }
	// 	}
	// 	console.log(j)
	// 	arr[j + 1] = c;
	var j = i - 1;
	while (j >= 0 && arr[j] < c) {
		arr[j + 1] = arr[j]
		j--;
	}
	arr[j + 1] = c;
}
console.log(arr);

4.快速排序

function quickSort(arr) {
	//如果陣列<=1,則直接返回
	if (arr.length <= 1) {
		return arr;
	}
	var pivotIndex = Math.floor(arr.length / 2);
	//找基準,並把基準從原陣列刪除
	var pivot = arr.splice(pivotIndex, 1)[0];
	//定義左右陣列
	var left = [];
	var right = [];

	//比基準小的放在left,比基準大的放在right
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] <= pivot) {
			left.push(arr[i]);
		} else {
			right.push(arr[i]);
		}
	}
	//遞迴
	return quickSort(left).concat([pivot], quickSort(right));
}
quickSort(arr);
console.log(arr);

5.隨機排序

arr.sort(() => Math.random() - 0.5)

6.利用洗牌演算法寫隨機排序

var arr = [10, 2, 8, 36, 17, 11, 9];
var len = arr.length;
var random = ([x, y], z) => {
	let data = Math.floor(Math.random() * (y - x) + x);
	return data === z ? random([x, y], z) : data;
}
let leng = len - 1;
for (let i = 0; i < len * 2; i++) {
	let _i = i % len;
	//正向排序
	let r = random([0, leng], _i);
	[arr[_i], arr[r]] = [arr[r], arr[_i]];
	//反向排序
	r = random([0, leng], _i);
	[arr[leng - _i], arr[r]] = [arr[r], arr[leng - _i]]
}
console.log(arr)