排序算法及其js实现(一)

简单选择排序

其思想是:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止.(与当前数字交换最大或最小数字)

完整记录:60,71,49, 11,24,3,66

如:假设已经排序的序列:3,11,24

       当前的记录:3,11,24,71,49,60,66

待排序的记录:71,49,60,66

选出最小的记录49,交换49和当前待排序的记录的第一个元素71。

则:已经排序的序列:3,11,24,49

当前的记录:3,11,24,49,71,60,66

待排序的记录:71,60,66

Javascript代码:

function selectionSort(arr){
	var key_index;
	for(var i=0;i<arr.length;i++){
		key_index=i;
		for(var j=i;j<arr.length;j++){
			if(arr[j]<arr[key_index])
            	            key_index=j;
		}
		if(key_index!=i)
		    [arr[i],arr[key_index]]=[arr[key_index],arr[i]];
	}
	console.log(arr);
}

时间复杂度:无论最好和最坏的情况下,都是O(n2),故平均时间复杂度是O(n2)。简单选择排序是不稳定排序。如序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了。

简单插入排序

其思想是:每步将一个待排序的记录,按其值的大小插入前面已经排序的序列中适当位置上,直到全部插入完为止。(下文采用交换法:始终移动当前需要插入的值;也可采用插入法删除当前需要插入的值,直接插入到当前位置)

完整记录:60,71,49, 11,24,3,66

如:假设已经排序的序列:49,60,71

       当前的记录:49,60,71, 11,24,3,66

待排序的记录:11,24,3,66

       待插入的记录:11

依次比较11与71、60、49的大小,找到11应该插入的位置,若不是,则将相应的数字往后移动(这里用交换两个数字来实现);若是,则插入。

则:已经排序的序列:11,49,60,71

当前的记录:11,49,60,71, 24,3,66

待排序的记录:24,3,66

       待插入的记录:24

Javascript实现代码:

function insertionSort(arr){
	var len=arr.length;
	for(var i=1;i<len;i++){
		for(var j=i;j>0&&arr[j]<arr[j-1];j--){
		    [arr[j],arr[j-1]]=[arr[j-1],arr[j]];
		}
	}
	console.log(arr);
}

简单插入排序在最好情况下,需要比较n-1次,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2),平均时间复杂度是O(n2)。由于交换的步骤仅发生在相邻的两个数之间,加之“<”才交换,因此插入排序的算法是稳定的。

冒泡排序:

其思想是:对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。(始终移动最大或最小的一个)

Javascript代码:

function bubbleSort(arr){
	for(var i=0;i<arr.length;i++){
		for(var j=1;j<arr.length-i;j++){
			if(arr[j]<arr[j-1]){
				[arr[j],arr[j-1]]=[arr[j-1],arr[j]];
			}
		}	
	}
	console.log(arr);
}

最好情况下,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2),平均时间复杂度是O(n2)。由于交换的步骤仅发生在相邻的两个数之间,加之“<”才交换,因此插入排序的算法是稳定的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值