js--直接插入排序实例+代码

直接插入排序的思想:将待排序的元素插入到已有序的数组中(在初始时不知道是否存在有序的数据,因此将第一个元素看成是有序的),将待排序元素与已经有序的数组依次进行比较(从后往前),如果待排序元素比数组中的元素大,就直接插入到这个有序数组后面;如果待排序元素比数组中的元素小,就将数组中的元素向后移动一位,将待排序元素接着与数组的元素进行比较,直到找到合适的插入位置。
算法步骤
1)从第一个元素开始,因为只有一个元素,所以该元素可以认为已经有序
2)取出下一个元素作为待排序元素,在已经排好序的元素序列中从后向前扫描
3)如果该元素(已排序)大于待排序元素,将该元素移到下一个位置
4)重复步骤3,直到找到已排序的元素小于或者等于待排序元素的位置
5)将待排序元素插入到该位置后;
6)重复步骤2~5,直到所有待排序元素全部插入到有序序列中去
是否稳定?
稳定
算法的时间复杂度:
O ( n 2 ) O(n^2)
最好的情况:
原始序列本身就有序,此时时间复杂度为O(n)
最坏的情况:
整个原始序列是逆序,此时时间复杂度为O(n^2)
实例
原始序列:
49 38 65 97 76 13 27 49
1)一开始只看第1个元素49,一个数字肯定是有序的,插入到有序序列中去:
49 38 65 97 76 13 27 49
2)插入38,38<49,所以49向后移动一个位置,把38插入到49原来的位置,此时,有序序列里有两个元素了:
38 49 65 97 76 13 27 49
3)插入65,65>49,不需要移动,直接插入到该有序序列之后:
38 49 65 97 76 13 27 49
4)插入97,97>65,不需要移动,直接插入到该有序序列之后:
38 49 65 97 76 13 27 49
5)插入76,76<97,97向后移动一个位置,继续比较,76>65,65不需要移动,于是76就应该放在97原来的位置:
38 49 65 76 97 13 27 49
6)插入13,13<97,97向后移动一个位置,继续比较,13<76,76向后移动一个位置,继续比较,13<65,65向后移动一个位置,继续比较,13<49,49向后移动一个位置,继续比较,13<38,38向后移动一个位置,此时已经比较完最后一个元素,比较结束,把13插入到38原来的位置:
13 38 49 65 76 97 27 49
7)插入27,27<97,97向后移动一个位置,继续比较,27<76,76向后移动一个位置,继续比较,27<65,65向后移动一个位置,继续比较,27<49,49向后移动一个位置,继续比较,27<38,38向后移动一个位置,27>13,13不需要移动,把27插入到38原来的位置
13 27 38 49 65 76 97 49
8)插入49,49<97,97向后移动一个位置,继续比较,49<76,76向后移动一个位置,继续比较,49<65,65向后移动一个位置,继续比较,49=49,原来的49不需要移动,现在的49插入到65原来的位置:
13 27 38 49 65 76 97 49
js代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			function InsertSort(arr){
				//外层循环控制插入排序的趟数
				for(var i = 1;i < arr.length;i++){
					var temp = arr[i];
					var j = i-1;
					//内层循环找到待排序关键字插入的位置
					while(j >= 0 && arr[j] > temp){
						arr[j+1]=arr[j];
						j--;
					}
					arr[j+1] = temp;
				}
				return arr;
			}
			var arr1 = [49,38,65,97,76,13,27,49];
			console.log(InsertSort(arr1));
		</script>
	</body>
</html>

控制台输出结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xt_123456/article/details/106182606