1.比较相邻的元素。若是第一个比第二个大,就交换他们两个。 2.对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3.针对全部的元素重复以上的步骤,除了最后一个。 4.持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。
var arr = [9,8,7,6,5,4,3,2,1,0]; //交换arr[i]和arr[j] function swap(arr,i,j){ var temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } //冒泡排序 function bubbleSort(arr){ var leap = 0; if(arr.length==0) return; for(var i = 0 ; i < arr.length ; i++){ leap = 0; for(var j = 1 ; j < arr.length ; j++){ if(arr[j-1] > arr[j]){ swap(arr,j-1,j); leap = 1; } } //若是没有交换,即排序正确,提早结束 if(leap == 0){ return; } } return arr; } console.log(bubbleSort(arr)); // arr = [0,1,2,3,4,5,6,7,8,9]
冒泡排序总的平均时间复杂度为Q(n^2)。java
循环arr.length次,从i=0开始,第i次循环将比较获得的最小(或最大)的数与a[i]交换位置,即每次循环拿出最值放到其应该在的位置,而且将其踢出下次循环。
//选择排序 function selectionSort(arr){ var min; if(arr.length <= 1) return; for(var i = 0 ; i < arr.length-1 ; i++){ min=i; for(var j = i+1 ; j < arr.length ; j++) { if(arr[j] < arr[min]){ min = j; } } swap(arr,i,min); } return arr; } console.log(selectionSort(arr)); // arr = [0,1,2,3,4,5,6,7,8,9]
比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好状况是,已经有序,交换0次;最坏状况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了算法
1.找一个数,对数组进行扫描,小于这个数的放在这个数的左侧,大于它的放在数组右侧 2.在对左右两侧的数组分别进行刚才的操做,直到数组长度为1时结束。
//快速排序 function fastSort(arr,begin,end){ //当end <= begin时结束递归 if(end <= begin){ return ; } var t = begin; var i = begin+1; var j = end; var v = arr[begin]; while (i <= j){ //经过选定的轴和其后一个值进行比较,如后一个值比他小则交换而且两个同时加一而且再比较,如比他大则a[i]和a[j]进行交换而且再比较a[begin]和a[i]的值 if (arr[i] <= v){ swap(arr, t++, i++); }else if(arr[i] > v){ swap(arr, i, j--); } } fastSort(arr, begin, t-1); fastSort(arr, j+1, end); } fastSort(arr,0,arr.length-1); console.log(arr); //arr = [0,1,2,3,4,5,6,7,8,9]
此快速排序是优化过的,可否再优化之后再试试看。数组
以上代码有部分是借鉴的,若有不足请指教^_^