【JS小白】学习冒泡排序、选排排序、插入排序
本文都以升序为例。
冒泡排序
左右交换,每回合排好一个最大的。
伪代码:
i是回合的计数,从0开始计数。
j和j+1是每次比较并可能交换的两个位置。
(arr):
i:[0,n-1)
j:[0,n-1-i)
if [j]>[j+1]
swap(j,j+1)
i也可以直接表示每一回合将会排好顺序的位置。
(arr):
i:[n-1,0)
j:[0,i)
if( [j] > [j+1])
swap(j,j+1)
JS代码测试
function bubbleSort_1(arr){
if(arr instanceof Array === false){
return;
}
for(let i = 0; i < arr.length - 1; i++){
for(let j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j+1]){
swap(arr, j, j+1);
}
}
}
return arr;
}
function swap(arr, i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function bubbleSort_2(arr){
for(let i = arr.length - 1; i > 0; i--){
for(let j=0; j < i; j++){
if(arr[j] > arr[j+1]){
swap(arr, j, j+1);
}
}
}
return arr;
}
console.log(bubbleSort_1([1,5,8,3,7,3,0,4,-3,-6]));
console.log(bubbleSort_2([1,5,8,3,7,3,0,4,-3,-6]));
选择排序
每一回合选择一个最小的元素,然后放到最左边。
也可以选最大的,放到右边,但下面以选择最小的为例。
伪代码:
i表示该回合将会被排好顺序的位置
i:[0,n-1)
minIndex=i
j:[i+1,n)
if([j]<[minIndex])
minIndex=j
swap(minIndex,i)
JS代码测试
function selectSort(arr){
let n=arr.length;
for(let i=0; i<n-1;i++){
let minIndex=i;
for(let j=i+1;j<n;j++){
if(arr[j]<arr[minIndex]){
minIndex=j
}
}
swap(arr,i,minIndex)
}
return arr
}
function swap(arr, i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
console.log(selectSort([1,5,8,3,7,3,0,4,-3,-6]));
插入排序
往有序的列表中插入元素。
对于数组,刚开始第0个元素时有序的,然后将第1个插入,这样0、1就是有序的,然后插入第2个元素,这样0、1、2都是有序的...
i表示当前回合被插入的元素,在i前面的都是有序的。
从0开始的话,其前面的有序列表是空的,数据不会有交换。所以从位置1开始即可。
伪代码:
i:[1,n)
preIndex=i-1
cur=[i]
while (preIndex>-1 && [preIndex]>cur):
[preIndex+1]=[preIndex]
preIndex--
[preIndex+1]=cur
JS代码测试
function insertSort(arr){
let n = arr.length;
for(let i=1;i<n;i++){
let preIndex=i-1;
let cur = arr[i]
while(preIndex>-1 && arr[preIndex]>cur){
arr[preIndex+1]=arr[preIndex]
preIndex--
}
arr[preIndex+1]=cur
}
return arr;
}
console.log(insertSort([1,5,8,3,7,3,0,4,-3,-6]));