常见的四种排序方法

冒泡排序

思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

冒泡排序的算法原理(从后往前):
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

//冒泡排序
/*
	思路分析:
	第一轮 第一步:[23,34,12,5,22,11]
	第一轮 第二步:[23,12,34,5,22,11]
	第一轮 第三步:[23,12,5,34,22,11]
	第一轮 第四步:[23,12,5,22,34,11]
	第一轮 第五步:[23,12,5,22,11,34]
	
	第二轮 第一步:[12,23,5,22,11,34]
	第二轮 第二步:[12,5,23,22,11,34]
	第二轮 第三步:[12,5,22,23,11,34]
	第二轮 第四步:[12,5,22,11,23,34]
	
	第三轮 第一步:[5,12,22,11,23,34]
	第三轮 第二步:[5,12,22,11,23,34]
	第三轮 第三步:[5,12,11,22,23,34]
	
	第四轮 第一步:[5,11,12,22,23,34]
*/	
function bubbleSort (arr) {
    // 控制冒泡的次数
    for (var i = 1;i<arr.length;i++) {
        // 控制每轮冒出一个数需要比较的次数
        for (var j = 0; j < arr.length-i; j++) {
            if (arr[j] > arr[j+1]) {//判断是否交换下标
                var temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
       }
    }
    return arr;
}
//调用:
var arr = [23,34,12,5,22,11];
console.log(bubbleSort(arr));

选择排序

思路分析:选择排序和冒泡排序的思路类似,也是依次相邻的数进行两两比较,不同之处在于,他不是每一次比较就进行交换位置,而是一轮比较完毕,找到最大值或者最小值之后,将其放在合适的位置,其他数的位置不变,先假设下标为0的数是最大数或者最小数,将数组遍历一遍,寻找是否存在比假设的这个数还要大或者还要小的数,如果有,交换位置,如果没有,不交换位置,然后下标自增,继续循环之前的程序

/*
	选择排序的思路分析:
	第1轮 第1步:var iMinK = 0;
	第1轮 第2步:23 和 34比较,什么也不做
	第1轮 第3步:23 和 11比较,iMinK = 2
	第1轮 第4步:11 和 22比较,什么也不做
	第1轮 第5步:11 和 19比较,什么也不做
	第1轮 第6步:11 和 18比较,什么也不做
	第1轮 第7步:下标0和下标2进行位置交换 [11, 34, 23, 22, 19, 18]

	第2轮 第1步:var iMinK = 1;
	第2轮 第2步:34 和 23比较,iMinK = 2
	第2轮 第3步:23 和 22比较,iMinK = 3
	第2轮 第4步:22 和 19比较,iMinK = 4
	第2轮 第5步:19 和 18比较,iMinK = 5
	第2轮 第6步:下标1和下标5进行位置交换 [11, 18, 23, 22, 19, 34]
*/

// 外层for循环确定轮数
var arr = [23, 34, 11, 22, 19, 18];
for(var i = 0; i < arr.length - 1; i++) {
	// 记录最小值的下标
	var iMinK = i;
	for(var j = i + 1; j < arr.length; j++) {
		if(arr[iMinK] > arr[j]) {
			iMinK = j;
		}
	}
	// 交换数据
	if(iMinK !== i) {
		var temp = arr[i];
		arr[i] = arr[iMinK];
		arr[iMinK] = temp;
	}
}
console.log(arr);
冒泡排序法和选择排序法的异同点:

冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。而选择排序算法的改进在于:先并不急于调换位置,先从arr[0]开始逐个检查,看哪个数最小就记下该数所在的位置max,等一躺扫描完毕,再把arr[max]和arr[0]对调,这时arr[0]到arr[i]中最小的数据就换到了最前面的位置。


所以,
选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数是一样的。


插入排序

思路分析:先把arr[1]对应的数字拿出来作为将要插入的数,和原数组的比他下标小的数做比较,如果满足条件,交换位置,否则原封不动,然后后几轮循环前面的步骤,最后输出这个数组。代码如下:

/*
 	插入排序的思路分析:
 	第1轮   第1步:var arr = [23,34,12,5,22,18,11];//34作为待插入数和23比较不交换位置
 	
 	第2轮   第1步:var arr = [23,12,34,5,22,18,11];//12作为待插入数和34比较交换位置
 	第2轮   第2步:var arr = [12,23,34,5,22,18,11];//12作为待插入数和23比较交换位置
 
 	第3轮   第1步:var arr = [12,23,5,34,22,18,11];//5作为待插入数和34比较交换位置
 	第3轮   第2步:var arr = [12,5,23,34,22,18,11];//5作为待插入数和23比较交换位置
 	第3轮   第3步:var arr = [5,12,23,34,22,18,11];//5作为待插入数和12比较交换位置
 	
 	第4轮   第1步:var arr = [5,12,23,22,34,18,11];//22作为待插入数和34比较交换位置
 	第4轮   第2步:var arr = [5,12,22,23,34,18,11];//22作为待插入数和23比较交换位置
 	第4轮   第3步:var arr = [5,12,22,23,34,18,11];//22作为待插入数和12比较不交换位置
 	第4轮   第4步:var arr = [5,12,22,23,34,18,11];//22作为待插入数和5比较不交换位置
 	
 	第5轮   第1步:var arr = [5,12,22,23,18,34,11];//18作为待插入数和34比较交换位置
 	第5轮   第2步:var arr = [5,12,22,18,23,34,11];//18作为待插入数和23比较交换位置
 	第5轮   第3步:var arr = [5,12,18,22,23,34,11];//18作为待插入数和22比较交换位置
 	第5轮   第4步:var arr = [5,12,18,22,23,34,11];//18作为待插入数和12比较不交换位置
 	第5轮   第5步:var arr = [5,12,18,22,23,34,11];//18作为待插入数和5比较不交换位置
 	
 	第6轮   第1步:var arr = [5,12,18,22,23,11,34];//11作为待插入数和34比较交换位置
 	第6轮   第2步:var arr = [5,12,18,22,11,23,34];//11作为待插入数和23比较交换位置
 	第6轮   第3步:var arr = [5,12,18,11,22,23,34];//11作为待插入数和22比较交换位置
 	第6轮   第4步:var arr = [5,12,11,18,22,23,34];//11作为待插入数和18比较交换位置
 	第6轮   第5步:var arr = [5,11,12,18,22,23,34];//11作为待插入数和12比较交换位置
 	第6轮   第6步:var arr = [5,11,12,18,22,23,34];//11作为待插入数和5比较不交换位置
 */

//外层循环确定轮次数
var arr = [23,34,12,5,22,18,11];
for(var i = 1;i < arr.length;i++){
	//内层的for循环
	for(var j = i ; j > 0; j--){
		if(arr[j] < arr[j-1]){
			var temp = arr[j];
			arr[j] = arr[j-1];
			arr[j-1] = temp;
		}else{
			break;
		}
	}
}
console.log(arr);

快速排序法

思路分析:

       1、先从数列中取出一个数作为基准数

       2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

       3、再对左右区间重复第二步,直到各区间只有一个数


var arr = [21,32,43,81,54,45,23];
function quickSort(arr) {
	if(arr.length <= 1) {
		return arr;	
	}
	var iBase = arr.shift();
	var left = [], right = [];

	for(var i = 0; i < arr.length; i++) {
		if(arr[i] < iBase) {
			left.push(arr[i]);
		} else {
			right.push(arr[i]);
		}
	}

	return quickSort(left).concat(iBase, quickSort(right));
}

var newArr = quickSort(arr);

console.log(newArr);
以上四种是比较常见的四种排序方式,在编程语言中还存在其他的排序方式,感兴趣的同学可以自行百度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章