1.冒泡排序
1.1 冒泡排序算法的运作如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.2 javaScript中的实现
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)。
2.选择排序
2.1 选择排序算法的思想:
循环arr.length次,从i=0开始,第i次循环将比较得到的最小(或最大)的数与a[i]交换位置,即每次循环拿出最值放到其应该在的位置,并且将其踢出下次循环。
2.2 javaScript中的实现
//选择排序
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次。交换次数比冒泡排序少多了
3.快速排序
3.1 快速排序算法的运作如下:
1.找一个数,对数组进行扫描,小于这个数的放在这个数的左侧,大于它的放在数组右侧
2.在对左右两侧的数组分别进行刚才的操作,直到数组长度为1时结束。
3.2 javaScript中的实现
//快速排序
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]
此快速排序是优化过的,能否再优化以后再试试看。
以上代码有部分是借鉴的,如有不足请指教^_^
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。