排序算法
基本排序算法
基本排序的基本思想非常类似,重排列时用的技术基本都是一组嵌套的for循环: 外循环遍历数组的每一项,内循环则用于比较元素。由于都要两层嵌套循环,所以平均时间复杂度都为
O(n²)。
一、冒泡排序
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
<script> var arr = [1,3,4,2,7,4,5,5,9,1]; function bubblesort(arr){ for(var i=0;i<arr.length-1;i++){ // 要比较的趟数 var flag = 0; //设置标志位判断这一趟有没有变换数值 for(var j=0;j<arr.length-1-i;j++){ //比较相邻的两个数,将比较大的那个放在后面,再比较相邻的数,循环将大的数放置在arr[arr.length-1-i]中
if(arr[j]>arr[j+1]){ var temp = 0; // 变换两个数的数值 temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; flag = true; } } if(flag==0){ //没有变换数值则有序 break; } } } bubblesort(arr); for(var k= 0;k<arr.length;k++){ document.write(arr[k]); } </script>
二、选择排序
顾名思义,就是选择最小的,外层循环当前要比较的位置,内层循环查找出剩下的元素里面最小的。
外层循环的i表示第几轮,arr[i]就表示当前轮次最靠前(小)的位置; 内层从i开始,依次往后数,找到比开头小的,互换位置即可。
function selectsort(arr){ var len = arr.length; for(var i=1;i<len;i++){ for(var j = i;j<len;j++){ if(arr[i]>arr[j]){ [arr[i],arr[j]] = [arr[j],arr[i]]; } } } return arr }
三、插入排序
首先将待排序的第一个记录作为一个有序段,从第二个开始,到最后一个,依次和前面的有序段进行比较,确定插入位置。插入排序核心--扑克牌思想: 就想着自己在打扑克牌,接起来一张,放哪里无所谓,再接起来一张,比第一张小,放左边,继续接,可能是中间数,就插在中间....依次
插入排序具体算法描述如下:
第一个元素默认为已经排序完成,取下一个元素,从后往前扫描已经完成的元素序列,如果扫描到的已经排序的元素大于取得的元素,则将扫描到的已经排序的元素移到下一个位置,知道找到扫描的元素小于或者等于新的元素,再取下一个元素重复。
function insertsort(arr) { var len = arr.length; for (var i = 1; i < len; i++) { for (var j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]; } else { break; } } } return arr }
1.i是外循环,依次把后面的数插入前面的有序序列中,默认arr[0]为有序的,i就从1开始
2. j进来后,依次与前面队列的数进行比较,因为前面的序列是有序的,因此只需要循环比较、交换即可
3. 注意这里的break,因为前面是都是有序的序列,所以如果当前要插入的值`arr[j]`大于或等于arr[j-1],则无需继续比较,直接下一次循环就可以了。
基本排序算法对于大数据来说处理量非常的大了,那么以下是高级排序算法,对于大数据来说,复杂度可以大大的减少了。
四、快速排序
快速排序是很重要的排序算法,采用了分而治之的想法,先找到一个基准,然后把大于基准的元素放在基准的右边,小于基准的元素放在基准的左边,接着递归此过程,直到此序列有序。
function quickSort1(arr) { if (arr.length < 1) { return arr; //递归出口 } var left = [], right = [], current = arr.splice(0, 1); //注意splice后,数组长度少了一个 for (var i = 0; i < arr.length; i++) { if (arr[i] < current) { left.push(arr[i]) //放在左边 } else { right.push(arr[i]) //放在右边 } } return quickSort1(left).concat(current,quickSort1(right)); //递归 }
快速排序算法的平均时间复杂度是O(n log n),最坏情况也是O(n²)。