排序算法之一冒泡排序

排序算法的相关概念

1、内部排序和外部排序

  内部排序:整个排序过程完全在内存中进行;

  外部排序:排序需要借助外部存储设备才能完成。

2、算法的稳定性

  相同关键字的领先关系在排序过程中不发生变活,则所用的排序方法是稳定的。

算法思想

从上往下扫描整个待排序数组,若相邻的两个数逆序,则交换位置(让较大的数沉下去,让较小的数冒泡上来)。

稳定性:稳定,平均算法复杂度:0(n2

function bubbleSort(arr,len){
    //冒泡过程需要要进行n-1次
    for(var i = 1;i <= len -1;i++){
        //第i次进行后最后i项排好,只需要比较前len - i项
        for(var j = 1;j <= len - i;j++){
            //若相邻两项逆序,则交换位置
            if(arr[j-1] >arr[j]){
                var temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

优化冒泡排序

设置一个flag,每一趟将flag设置成false,如果这一趟发生了交换,则将flag设置为true。如果有一趟没有发生交换,说明排序已经完成。冒泡过程最多进行 n-1 次。

function bubbleSort(arr,len){
    var flag = true;
    for(var i = 1;i <= len -1 && flag;i++){
        flag = false;
        for(var j = 1;j <= len - i;j++){
            //若相邻两项逆序,则交换位置,并将flag设置为true
            if(arr[j-1] >arr[j]){
                var temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
                flag = true;
            }
        }
    }
    return arr;
}

再一次优化

设置一个flag,每一趟将flag设置为0,若某一趟在某一个位置发生了交换,就将flag立在这个位置,说明这个位置以后的都已经排好了,只需要对这个位置之前的数进行排序。

function bubbleSort(arr,len){
    var flag = len,n = flag;
    while(flag > 0){
        n = flag;
        flag = 0;
        for(var j = 1;j < n;j++){
            if(arr[j-1] >arr[j]){
                var temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
                flag = j;
            }
        }
    }
    return arr;
}

 

posted @ 2018-07-30 15:05  叶子叶子耶  阅读(204)  评论(0编辑  收藏  举报