首页 > 编程语言 > 详细

简单排序算法(冒泡排序、插入排序、选择排序)

时间:2021-05-14 15:45:02      阅读:38      评论:0      收藏:0      [点我收藏+]

冒泡排序

冒泡排序可能是我们接触的第一个排序算法了,比较简单也实用。

思路:依次比较相邻的两个元素,值大的就换到右边,一趟循环下来最右边就是最大的元素了。然后再从头开始,找第二大的元素,这样一直走下来,整个数组就有序了。

可以参考以下gif图,理解冒泡排序的思想。
技术分享图片

那么N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以需要比较的次数就是[n(n-1)]/2,即时间复杂度为 O(n^2)

直接上代码:

var bubbleSort = function(array){			//冒泡排序
    var length = array.length
    for (var i = 0; i < length; i++) {
        for (var j = 0; j < length-1-i; j++) {
            if (array[j] > array[j+1]) {
                swap(array, j, j+1);
            }
        }
    }
}

var swap = function(array, index1, index2){			//交换两个元素的位置
    var aux = array[index1];
    array[index1] = array[index2];
    array[index2] = aux;
}
var createNonSortedArray =function(size){			//创建一个size大小的无序列表ArrayList
    var array = new Array();
    for (var i = size; i > 0; i--) {
        array.push( parseInt(Math.random()*10000));
    }
    return array;
}

var arr = createNonSortedArray(10000);
bubbleSort(arr);

这个代码无论是最好的情况(数组有序),还是最坏情况(数组逆序),需要比较的次数都是[n(n-1)]/2,也就是时间复杂度均为 O(n^2),但如果是最好的情况,一趟比较下来发现没有元素要交换,那么时间复杂度就能降到 O(n),故再加一个标志位,就能让冒泡排序的最好情况时间复杂度降到 O(n),如下:

var bubbleSort = function(array){
    var length = array.length,
    for (var i = 0; i < length; i++) {
		var didSwap = false;			//设置标志位
        for (var j = 0; j < length-1-i; j++) {
            if (array[j] > array[j+1]) {
                swap(array, j, j+1);
                didSwap = true;
            }
        }
        if(!didSwap) break;				//没有交换了,直接跳出循环
    }
}

插入排序

思想:一个元素就是有序的,那么从第二个元素开始,与它之前的元素作比较,如果比之前的元素小,就交换位置。直到比某个元素大,就结束此次循环,也就找到了该元素应该在的位置了。把所有元素都走一遍,整个数组就有序了。

可以参考以下gif图,理解冒泡排序的思想。
技术分享图片

在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N-1次,时间复杂度为 O(n)。

最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为 O(n^2)。

var insertionSort = function(array){
    var length = array.length,
        temp, j;
        for(var i = 1; i<length; i++){
        j = i;
        temp = array[i];
        while(j > 0 && array[j-1] > temp){
            array[j] = array[j-1];
            j--;
        }
        array[j] = temp;
    }
}

简单排序算法(冒泡排序、插入排序、选择排序)

原文:https://www.cnblogs.com/EaVango/p/14767783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!