06-JS数组的排序

image.png

1.桶排序

  • 方法一(不能排序重复的元素,且排序的元素不能为负数)
var arr = [3, 1, 0, 23,, 43, 4]
var bucket = [];
var res = [];
//用for in循环过滤23后面的undefined项
for (var i in arr) {
  bucket[arr[i]] = 1;
}
console.log(bucket);
arr.length = 0;

for (var index in bucket) {
  res.push(index);
}
console.log(res);
  • 方法二:(可以有重复的元素,但排序的元素不能为负数)
var marks = [1, 5, 3, 2, 7, 4, 0, 0, , 7, 150, 6, 2, 2, 8, 10, 9];
var arr = []
var newArr = [];

for (i = 0; i < marks.length; i++) {
    if (arr[marks[i]]) {
        arr[marks[i]]++
    } else {
        arr[marks[i]] = 1
    }
}

for (j = 0; j < arr.length; j++) {
    if (!arr[j]) {
        continue
    }
    // 有几个重复的值,就push几次
    for (k = 0; k < arr[j]; k++) {
        newArr.push(j)
    }
}
console.log(newArr)

2.冒泡排序

每轮比对,比对数组剩余需要比对的lenght - 1次

var arr = [5, 3, 5, 2, 8, ,0, 3];
for (var i = 0; i < arr.length - 1; i++) {
    // 找到最大值
    for (var j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
    //如果数组中有空值,则把它移到最后
    for(var k = 0; k < arr.length; k++){
        if(arr[k] === undefined){
            arr.splice(k, 1);
            arr.length++;
        }
    }
}
console.log(arr);

3.选择排序

var arr = [5, 2, 7, 1, 4];    
for (var i = 0; i < arr.length - 1; i++) {
        var min = arr[i];
        var minIndex = i;
        for (var k = minIndex + 1; k < arr.length; k++) {
            if (min > arr[k]) {
                min = arr[k];
                minIndex = k;
            }
        }
        //换位
        arr[minIndex] = arr[i];
        arr[i] = min;
    }
console.log(arr);

4.快速排序(一分为二)

var arr = [5, 2, 7, 1, 4];
function quickSort(arr) {
    // 终止条件
    if (arr.length <= 1) {
        return arr;
    }
    // 取中点(可以是任意值)var middleIndex = 0;
    var middleIndex = parseInt(arr.length / 2);
    var middle = arr[middleIndex];
    // 分左右
    var ltArray = [];
    var gtArray = [];
    for (var i = 0; i < arr.length; i++) {
        // 略过中间的分割条件
        if (i === middleIndex) {
            continue;
        }
        if (arr[i] < middle) {
            ltArray.push(arr[i]);
        } else {
            gtArray.push(arr[i]);
        }
    }
    return quickSort(ltArray).concat([middle], quickSort(gtArray));
}
console.log(quickSort(arr));

5.sort排序

用于对数组的元素进行排序。

var arr = [1, 5, 3, 2, 7, 4, 7, 15, 6, 2, 8, 10, 9];
arr.sort();
console.log(arr);   //[1, 10, 15, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9]

// 正序:由小到大
arr.sort(function(a, b) {
    return a - b;
});
console.log(arr);   //[1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 15]
// 倒序:由大到小
arr.sort(function(a, b) {
    return b - a;
});
console.log(arr);   //[15, 10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 2, 1]
  • 重写sort()
var arr = [1, 5, 3, 2, 7, 4, 7, 15, 6, , 2, 8, 10, 9];

function sort1(arr, fn) {
    var s = 0;
    for (var k = 0; k < arr.length; k++) {
        if (arr[k] === undefined) {
            arr.splice(k, 1);
            arr.length++;
            s++;
        }
    }
    var len = arr.length - s;
    while (len > 0) {
        for (var i = 0; i < len; i++) {
            if (fn && fn(arr[i], arr[i + 1]) > 0) {
                var temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            } else {
                var a = Number(String(arr[i])[0]);
                var b = Number(String(arr[i + 1])[0]);
                if (a - b > 0) {
                    var temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        len--;
    }
}

//从小到大 a - b > 0 - > arr[i] - arr[i + 1] > 0-- > arr[i] > arr[i + 1];
//从大到小 b - a > 0 - > arr[i + 1] - arr[i] > 0-- - > arr[i] < arr[i + 1];
sort1(arr, function(a, b) {
    return a - b;
})
sort1(arr);
console.log(arr);   //[1, 10, 15, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, empty]
//只能排序,数组项的第一位(个位)
  • sort倒序遍历字符
var arr = ["a", "c", "d", "b", "e", "g"];

arr.sort(function(a, b) {
    return b.charCodeAt(0) - a.charCodeAt(0);
})
console.log(arr);   //["g", "e", "d", "c", "b", "a"]
  • 用sort将数组随机乱序
var arr = [1, 5, 3, 2, 7, 4, 7, 15, 6, , 2, 8, 10, 9];

arr.sort(function(){
    return Math.random()-0.5;
});
console.log(arr);
  • 洗牌算法(Fisher-Yates随机置乱算法 )

算法步骤为:

  1. 建立一个数组大小为 n 的数组 arr,分别存放 1 到 n 的数值;
  2. 生成一个从 0 到 n - 1 的随机数 x;
  3. 输出 arr 下标为 x 的数值,即为第一个随机数;
  4. 将 arr 的尾元素和下标为 x 的元素互换;
  5. 同2,生成一个从 0 到 n - 2 的随机数 x;
  6. 输出 arr 下标为 x 的数值,为第二个随机数;
  7. 将 arr 的倒数第二个元素和下标为 x 的元素互换;
  8.                  ……                 
    
  9. 如上,直到输出 m 个数为止

各种排序的时间复杂度对比

排序 是否稳定 最好时间复杂度 最坏时间复杂度 平均时间复杂度 空间复杂度
冒泡排序 稳定 O(n) O(n^2) O(n^2) O(1)
直接插入排序 稳定 O(n) O(n^2) O(n^2) O(1)
希尔排序 不稳定 O(n^1.3) O(n^1.3) O(n^1.3) O(1)
直接选择排序 不稳定 O(n^2) O(n^2) O(n^2) O(1)
堆排序 不稳定 O(nlog2n) O(nlog2n) O(nlog2n) O(1)
快速排序 不稳定 O(nlog2n) O(n^2) O(nlog2n) O(nlog2n)
归并排序 稳定 O(nlog2n) O(nlog2n) O(nlog2n) O(n)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,124评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,453评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,386评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,136评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,142评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,593评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,958评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,944评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,477评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,512评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,639评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,227评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,971评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,397评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,550评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,203评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,713评论 2 366

推荐阅读更多精彩内容

  • 1.用js实现随机选取10~100之间的10个数字,存入一个数组,并排序 //要是获取不重复的,则对随机数...
    persistlu阅读 5,598评论 0 0
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 1,802评论 0 7
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 666评论 0 0
  • 参考:十大经典排序算法 0、排序算法说明 0.1排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明...
    谁在烽烟彼岸阅读 1,020评论 0 12
  • 第五章******************************************************...
    fastwe阅读 689评论 0 0