排序算法(JS)

自己整理一下数据结构的排序算法,用js写了一下,测试正确。

//插入排序
var table=[32,26,87,72,26,17];
for(var i=0;i<table.length;i++){
	var temp=table[i];
	for(var j=i-1;j>=0&&temp<table[j];j--){  //前面较大的元素向后移动
		table[j+1]=table[j];
	}
	table[j+1]=temp;   //temp值到达插入位置
	alert("第"+i+"趟:"+table);

}
//希尔排序
var table=[27,38,65,97,76,13,27,49,55,4];
var num=0;
for(var d=table.length/2;d>0;){
	
	for(var i=d;i<table.length;i++){
		var temp=table[i];
		for(var j=i-d;j>=0&&temp<table[j];j-=d){
			table[j+d]=table[j];
		}
		table[j+d]=temp;  //插入元素
	}
	d=parseInt(d/2); 
	num++;
	alert(num);
	alert("第"+num+"趟:"+table);
}

冒泡排序

        比较相邻两个元素的关键字,如果反序,则交换。若按升序,每一趟将被扫描的数据序列中的最大元素交换到最后位置,就像气泡从水里冒出来一样。

//冒泡排序
var table=[32,26,87,72,26,17];
var exchange=true;
for(var i=0;i<table.length&&exchange;i++){  //有交换时才进行下一步,最多n-1趟
	exchange=false;

	for(var j=0;j<table.length;j++){
		var temp=table[j];
		if(table[j]>table[j+1]){
			table[j]=table[j+1];
			table[j+1]=temp;
			exchange=false;   //有交换
		}
	}
	alert(i+table);
}

快速排序

      快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

<pre name="code" class="javascript">//快速排序
var table=[38,26,97,19,66,1,5,49];
var num=0;  //记录次数
quickSort(table,0,table.length-1);

function quickSort(table,begin,end){	
	if(begin<end){
		var i=begin;
		var j=end;
		var vot=table[i]; //第一个值为基准值		

		while(i!=j){  //一趟排序
			while(i<j&&vot<=table[j])  //从后向前寻找较小值
				j--;
			if(i<j)
				table[i++]=table[j];  //较小数值向前移动

			while(i<j&&table[i]<=vot) //从前往后寻找较大值
				i++;
			if(i<j)
				table[j--]=table[i];   //较大值向后移动
		}
		table[i]=vot;
		num++;
		alert("第"+num+"趟:"+table);
		quickSort(table,begin,j-1);
		quickSort(table,i+1,end);

	}
}
 

//直接选择排序   不稳定
var table=[38,97,26,19,38,5];
for(var i=0;i<table.length-1;i++){
	var min=i;      //设第i个数据最小

	for(var j=i+1;j<table.length;j++){  
		if(table[j]<table[min]){
			min=j;     //记住最小元素小标
		}
	}

	if(min!=i){       //将本趟最小元素换到最前面
		var temp=table[i];
		table[i]=table[min];
		table[min]=temp;
	}
	
	alert("第"+i+"趟:"+table);
}



 

JavaScript中常用的排序算法有快速排序、选择排序和堆排序。其中快速排序的平均复杂度为n(log n),选择排序和堆排序的平均复杂度为n^2。下面是三种排序算法的JavaScript代码实现: 快速排序: var quickSort = function(arr) { if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1); var left = []; var right = []; for (var i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); }; 选择排序: function selectionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { var len = array.length, temp; for (var i = 0; i < len - 1; i++) { var min = array[i]; for (var j = i + 1; j < len; j++) { if (array[j] < min) { temp = min; min = array[j]; array[j] = temp; } } array[i] = min; } return array; } else { return 'array is not an Array!'; } } 堆排序: function heapSort(arr) { var len = arr.length; function buildHeap(arr) { for (var i = Math.floor(len / 2); i >= 0; i--) { heapify(arr, i); } } function heapify(arr, i) { var left = 2 * i + 1, right = 2 * i + 2, largest = i; if (left < len && arr[left] > arr[largest]) { largest = left; } if (right < len && arr[right] > arr[largest]) { largest = right; } if (largest !== i) { swap(arr, i, largest); heapify(arr, largest); } } function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } buildHeap(arr); for (var i = len - 1; i > 0; i--) { swap(arr, 0, i); len--; heapify(arr, 0); } return arr; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值