1.冒泡排序
排序规则:前后两两进行比较,如果符合比较的条件,就交换两个数的位置,直到所有的数据都符合从小到大的条件,则结束排序。实现排序利用双重for循环,外层循环决定比较的轮次,而内层循环决定每一轮比较多少次。每比较完一轮,会得到一个最大的数在后面。
function bubbleSort(arr){
var temp;//用于占时存储元素,实现元素交换
for(var i=0;i<arr.length;i++){//决定比较的轮次
for(var j=0;j<arr.length-i-1;j++){//决定每轮比较的次数,每一次,比较的次数都会少1,因为每次都会得到一个最大值在后面,每一次最大的值就不用参与下一轮比较了,所以是j<arr.length-i-1
if(arr[j]>arr[j+1]){//相邻元素两两比较
temp=arr[j]; //元素交换
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
测试代码:
var a = [1,5,4,2,6,9,7];
console.log(bubbleSort(a));
//[1,2,4,5,6,7,9]
2.选择排序
排序规则:每次把当前轮次的索引下标对应的元素设置为最小元素所在下标,然后依次和后面元素比较大小,如果找到比设置的最小元素值更小的元素,则把找到的这个元素的下标设置为最小元素所在的下标,每比较完一轮后,就把这个最小下标对应的元素值与当前轮次的索引所在的位置的元素值进行交换。依次类推,完成排序。
function selectSort(arr) {
for(var i=0;i<arr.length-1;i++){//比较轮次,最后一个元素就不用比较了,因为只剩它一个了,肯定是最大了
var minIndex=i,temp;//minIndex 设置当前轮次索引为最小元素所在下标 temp:实现数据交换
for(j=i+1;j<arr.length;j++){//每轮比较次数,之所以为i+1,是因为每比较完一次,前面的数都有序了,不用在比较了
if(arr[j]<arr[minIndex]){//找到比设置最小元素更小的元素
minIndex=j;//将该最小元素的下标赋值给minIndex
}
}
//完成数据交换,将最小元素放入到当前轮次的下标对应元素
temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
return arr;//返回排序后的数组
}
测试代码:
var a=[1,5,2,4,6,8,4]
console.log(selectSort(a))
//[1,2,4,4,5,6,8]
3.插入排序
排序规则:插入排序就像是打扑克牌一样,从第一张牌开始,将后面的牌依次与前面的比较,比谁小,就把该张牌插入到它前面去,最后牌将从小到大顺序排序。
function insertSort(arr) {
var len = arr.length;//数组长度
var preIndex, current;//前一个下标 当前值
for (var i = 1; i < len; i++) {//从第二个元素开始
preIndex = i - 1;//当前索引的前一个索引下标
current = arr[i];//当前元素
while(preIndex >= 0 && arr[preIndex] > current) {//通过while循环判断,如果当前元素比前一个元素小
arr[preIndex + 1] = arr[preIndex];//将当前prevIdex下标对应元素往后移动一个位置
preIndex--;//只要preIndex只比1大,就继续减1,进行判断,
}
arr[preIndex + 1] = current;//退出while循环时,此时pevIndex下标的后一个位置就是current的位置了
}
return arr;//排序后数组
}
测试代码:
var a = [1, 5, 4, 2, 6, 9, 7];
console.log(insertSort(a));
//[1,2,4,5,6,7,9]