一辛馆、冒泡排序
算法描述如下:
- 比較相鄰的元素俺陋。如果第一個比第二個大,就交換它們兩個;
- 對每一對相鄰元素作同樣的工作腊状,從開始第一對到結(jié)尾的最后一對诱咏,這樣在最后的元素應(yīng)該會是最大的數(shù);
- 針對所有的元素重復(fù)以上的步驟寿酌,除了最后一個胰苏;
- 重復(fù)步驟1~3,直到排序完成醇疼。
JavaScript代碼實現(xiàn):
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { //相鄰元素兩兩對比
var temp = arr[j+1]; //元素交換
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
二硕并、快速排序
快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:
- 從數(shù)列中挑出一個元素秧荆,稱為 "基準"(pivot)倔毙;
- 重新排序數(shù)列,所有元素比基準值小的擺放在基準前面乙濒,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)陕赃。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置颁股。這個稱為分區(qū)(partition)操作么库;
- 遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序。
Javascript代碼實現(xiàn):
//方法一甘有、運行時間較快
function quickSort1(arr){
if(arr.length <=1){
return arr;
}
var pivotIndex = Math.floor(arr.length/2);
var pivot = arr.splice(pivotIndex,1)[0];//返回數(shù)組長度一半的元素作為基準
var left=[];
var right=[];
for(var i=0; i < arr.length; i++){
if(arr[i]<pivot){ //元素小于基準诉儒,push到左邊的數(shù)組
left.push(arr[i]);
}else{
right.push(arr[i]) //元素大于基準,到右邊
}
}
//把左右兩邊數(shù)組以及基準連起來
return quickSort1(left).concat([pivot], quickSort1(right));
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort1(arr));
//方法二
function quickSort2(array, left, right) { //left和right分別為數(shù)組的開始和結(jié)束位置
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array'
&& typeof left) { //判斷array是否為數(shù)組
if (left < right) {
var i = left - 1,
temp;
for (var j = left; j <= right; j++) {
if (array[j] <= array[right]) {
i++;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quickSort2(array, left, i - 1);
quickSort2(array, i + 1, right);
}
return array;
} else {
return 'array is not an Array or left or right is not a number!'
}
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort2(arr,0,arr.length-1));
三亏掀、選擇排序
每一次從待排序的數(shù)據(jù)元素中選出最谐婪础(或最大)的一個元素,存放在序列的起始位置滤愕,直到全部待排序的數(shù)據(jù)元素排完温算。
算法描述如下:
- 初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空间影;
- 第i趟排序(i=1,2,3...n-1)開始時注竿,當前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區(qū)中-選出關(guān)鍵字最小的記錄 R[k]魂贬,將它與無序區(qū)的第1個記錄R交換蔓搞,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū);
- n-1趟結(jié)束随橘,數(shù)組有序化了喂分。
Javascript代碼實現(xiàn):
function selectionSort(arr) {
var minIndex, temp;
for (var i = 0; i < arr.length - 1; i++) {
minIndex = i;
for (var j = i + 1; j <arr.length; j++) {
if (arr[j] < arr[minIndex]) { //尋找最小的數(shù)
minIndex = j; //將最小數(shù)的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
四、插入排序
一般來說机蔗,插入排序都采用in-place在數(shù)組上實現(xiàn)蒲祈。具體算法描述如下:
- 從第一個元素開始甘萧,該元素可以認為已經(jīng)被排序;
- 取出下一個元素梆掸,在已經(jīng)排序的元素序列中從后向前掃描扬卷;
- 如果該元素(已排序)大于新元素,將該元素移到下一位置酸钦;
- 重復(fù)步驟3怪得,直到找到已排序的元素小于或者等于新元素的位置;
- 將新元素插入到該位置后卑硫;
- 重復(fù)步驟2~5徒恋。
Javascript代碼實現(xiàn):
function insertionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
for (var i = 1; i < array.length; i++) {
var key = array[i];
var j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
} else {
return 'array is not an Array!';
}
}