排序=比较+交换=无序区+有序区
js自带的排序,sort()函数。
sort()函数本质是上把所有的元素转换成String再排序,通过ASCII来排序,就会造成大小写,数字比较不是你想的结果
所以不推荐使用 arr.sort();
幸运的是,sort()方法是一个高级函数,可以接受一个比较函数来实现自定义的排序。修改了原数组
'use strict';
var arr=[2,1,23,4,2,4,4];
arr.sort(function (x,y) {
if(x>y){
return 1
}
if(x<y){
return -1;
}
return 0;
});
console.log("+++++++++++++",arr); 1 2 2 4 4 4 23
若对字符串排序,要忽略大小写
ar arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if (x1 < x2) {
return -1;
}
if (x1 > x2) {
return 1;
}
return 0;
}); // ['apple', 'Google', 'Microsoft']
1、冒泡排序:
在无序区比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置。每一次遍历都会将本次遍历最大的数冒泡到最后。为了将n个数排好序,需要n-1次遍历。 如果某次遍历中,没有调整任何两个相邻的数的位置关系,说明此时数组已排好序,可以结束程序。
<script>
arr = [2, 3, 5, 16, 1, 2, 6, 3, 2]
paixu(arr);
function paixu(arr) {
var flag = true;
for (var i = 1; i < arr.length; i++) { //表示本次是第i次遍历
for (var j = 0; j < arr.length - i; j++) {
// 比较相邻的元素
if (arr[j] > arr[j + 1]) {
// js方法交换
// var temp=arr[j];
// arr[j]=arr[j+1];
// arr[j+1]=temp;
// es6方法交换
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
flag = false;
}
}
// 走完j后还是没有交换flag=false
if (flag) {
break;
}
}
console.log("+++++", arr);
}
2、选择排序:
第i轮遍历arr[0:n-i]选出最大的数,与arr[n-i]互换。
输出是原序列的一个重排 ,它们通过对数组中的元素进行比较来实现排序,
// 自定义原型函数 如splice map等都是数组本身的原型方法。
Array.prototype.selectSort = function () {
var i, j;
for (i = 1; i <=this.length-1; i++) { // 共进行n-1趟排序 表示本次是第i趟排序,确定第几大的位置
var maxIndex = 0;
// 比较 找到无序区里最大的值
for (j = 0; j <= this.length - i; j++) { //访问子序列为arr[0:this.length-i]
if (this[j] > this[maxIndex]) {//当前值大于当前最大值时,记录索引
// 找到最大的值
maxIndex = j;
}
}
//交换 将最大值和有序区位置进行交换
[this[this.length - i], this[maxIndex]] = [this[maxIndex], this[this.length - i]]
}
};
var arr = [43, 21, 10, 5, 9, 15, 32, 57, 35];
arr.selectSort();
console.log(arr);
3、插入排序:有序区+无序区
<script>
Array.prototype.insertSort = function () {
var i, j;
for (i = 1; i < this.length; i++) { // i表示要插入的数字的索引,从第二个数开始前插
var val = this[i]; // 记录当前要插入数组的大小
/*
* 用指针j(从后向前遍历i-1得位置开始)来遍历第i个数字前面的,已经排好序的子数组。当j没有指到头,并且j的数字大于要插入的数字时,说明
* j还要向前遍历,直到发现一个比要插入数字小的位置pos,然后将这个数字插到pos+1处。如果j已经指到头了,
* 到了-1了还没有找到比当前数字小的位置,就把当前数字放在索引0处。
* */
for (j=i-1;j>=0&&this[j]>val;j--) {
// 数据后移
this[j+1]=this[j];
}
// 插入val
this[j+1]=val;
}
}
var arr = [43, 21, 2, 3, 4, 1, 4];
arr.insertSort();
console.log("++++++++++", arr)
</script>
4、快速排序
<script>
Array.prototype.quickSort=function (asc=true) {
quickSort(this,0,this.length-1,asc);
}
function quickSort(arr,start,end) {
if(start<end){
// pivot记录枢轴插入的位置;
var pivot= partition(arr,start,end);
quickSort(arr,start,pivot-1); // 递归的对temp左边的元素进行排序
quickSort(arr,pivot+1,end); // 递归的对temp右边的元素进行排序
}
}
// 下面这个函数完成一趟排序
function partition(arr,start,end) {
// temp是枢轴,是待排序元素的第一个,一趟排序后,枢轴左边小于等于temp,右边大于等于temp
var temp=arr[start];
while (start!=end) {
while (start<end&&arr[end]>temp) {end--;} // 从右向左扫描找到一个小于temp的元素
if(start<end){
arr[start]=arr[end]; // 把右边值放到左边
start++; // start 右移
}
while (start<end&&arr[start]<temp) {start++;}
if(start<end){
arr[end]=arr[start];// 把左边值放到右边
end--; // end左移
}
}
arr[start]=temp; //将temp放到最终位置,完成一次排序(小于或等于)temp(大于或等于)
return start;
}
var arr=[49,38,65,97,76,13,27,49];
arr.quickSort();
console.log("+++++++++++",arr);
</script>