用JavaScript实现的排序算法

前言

这个是自己使用JavaScript实现的排序算法,里面可能有一些地方还不是很好,望大家指正。

/**1.创建数据**/
	/**
	 * 1.1生成升序的200个数组数据
	 * @return {[type]} [description]
	 */
	function createAscending(){
		var array = [];
		for(var index = 0; index < 20; index++){
			array[index] = index;
		}
		return array;
	}
	/**
	 * 1.2生成降序的200个数组数据
	 * @return {[type]} [description]
	 */
	function createDescending(){
		var array = [];
		for(var index = 19; index >= 0; index--){
			array[array.length] = index;
		}
		return array;
	}
	/**
	 * 1.3生成乱序的200个数组数据
	 * @return {[type]} [description]
	 */
	function createArray(){
		var array = [];
		for(var index = 0; index < 20; index++){
			array[array.length] = Math.round(Math.random()*20);
		}
		return array;
	}

/* 
* 2.获得时间差,时间格式为 年-月-日 小时:分钟:秒 或者 年/月/日 小时:分钟:秒 
* 其中,年月日为全格式,例如 : 2010-10-12 01:00:00 
* 返回精度为:秒,分,小时,天
*/

	function GetDateDiff(startTime, endTime, diffType) {
		//作为除数的数字
		var divNum =1;
		//将计算间隔类性字符转换为小写
		diffType = diffType.toLowerCase();
		switch (diffType) {
			case "Milliseconds":
				divNum = 1;
				break;
			case"second":
				divNum =1000;
				break;
			case"minute":
				divNum =1000*60;
				break;
			case"hour":
				divNum =1000*3600;
				break;
			case"day":
				divNum =1000*3600*24;
				break;
			default:
				break;
		}
		document.write("该算法的时间所花费的时间为");
		document.write(parseInt((endTime.getTime() - startTime.getTime()) / parseInt(divNum)));
		document.write("<br/>");
	}
/**
 * 3. 排序算法
 */
 	/**
 	 * 3.1冒泡排序-升序版
 	 * @param  {[type]} array [description]
 	 * @return {[type]}       [description]
 	 */
	function bubbleSort(array){
		var comNum = 0,  //比较次数
		    moveNum = 0, //移动次数
			i = 0, 
			j, 
			temp,
			length;
		for(i = 0, length = array.length; i < length; i++){
			for(j = 0; j< length - i-1 ; j++){
				comNum++;
				if(array[j+1] < array[j]){
					moveNum++;
					temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp;
				}
			}
		}
		document.write("关键字比较次数"+comNum+";<br/>");
		document.write("关键字移动次数"+moveNum+";<br/>");
	}
	/**
	 * 3.2直接插入排序-升序版
	 * @param  {[type]} array [description]
	 * @return {[type]}       [description]
	 */
	function diractInsertionSort(array){
		var comNum = 0,moveNum = 0;
		var i = 0, j, temp;
		for(i = 0; i < array.length ; i++){
			comNum++;
			if(array[i+1] < array[i]){
				temp = array[i+1];
				j = i+1;
				do{
					j--;
					array[j+1] = array[j];
					moveNum++;
				}while(temp < array[j-1]);
				array[j] = temp;
				moveNum++;
			}
		}
		document.write("关键字比较次数"+comNum+";<br/>");
		document.write("关键字移动次数"+moveNum+";<br/>");
	}

	/**
	 * 3.3简单直接排序-升序版
	 * @param  {[type]} array [description]
	 * @return {[type]}       [description]
	 */
		function simpleSelectionSort(array){
			var comNum = 0,moveNum = 0;
			var i = 0, j, min= 0,temp;
			for(i = 0; i < array.length; i++){
				min = i;
				for(j = i; j < array.length; j++){
					comNum++;
					if(array[min] > array[j]){
						min = j;
					}
				}
				if(min != i){
					moveNum++;
					temp = array[min];
					array[min] = array[i];
					array[i] = temp;
				}
			}
			document.write("关键字比较次数"+ comNum +";<br/>");
			document.write("关键字移动次数"+ moveNum +";<br/>");
		}
	/**
	 * 3.4快速排序
	 * @param  {[type]} array [description]
	 * @return {[type]}       [description]
	 */
		qComNum = 0; qMoveNum = 0;
		function quickSort(array){
			qComNum = 0; 
			qMoveNum = 0;
			qSort(array,0,array.length-1);
			document.write("关键字比较次数"+qComNum+";<br/>");
			document.write("关键字移动次数"+qMoveNum+";<br/>");
		}

		function qSort(array, low, high){
			var privotloc;
			if(low < high){
				privotloc = partition(array, low, high);
				if(privotloc != 0){
					arguments.callee(array, low, privotloc-1);
				}
				if(privotloc != array.length){
					arguments.callee(array, privotloc+1, high);
				}
			}
		}
		function partition(array, low, high){
			var temp,i,j;
			i = low;
			j = high;
			temp = array[low];
			while(low < high){
				qComNum++;
				while(low < high  &&  array[high] >= temp){
				--high;					
				}
				if(low!=high){
					array[low] = array[high];
					qMoveNum++;
				}
				qComNum++;
				while(low < high  &&  array[low] <= temp){
					++low;
				}
				if(high!= low){
					array[high] = array[low];
					qMoveNum++;
				}
				if(i == low && j == high) break;
			}
			if(array[low] != temp){
				qMoveNum++;
				array[low] = temp;
			}
			return low;
		}
	/**
	 * 3.5希尔排序
	 * @param  {[type]} array [description]
	 * @param  {[type]} d     [description]
	 * @param  {[type]} t     [description]
	 * @return {[type]}       [description]
	 */
		sComNum = 0; sMoveNum = 0;
		function shell(array){
			sComNum = 0; sMoveNum = 0;
			dk = [5,3,1];
			shellSort(array,dk,3);
			document.write("关键字比较次数"+sComNum+";<br/>");
			document.write("关键字移动次数"+sMoveNum+";<br/>");
		}
		function shellSort(array,d,t){
			var k;
			for(k = 0; k < t; k++){
				shellInsert(array, d[k]);
			}
		}
		function shellInsert(array, dk){
			var i, j;
			for(i = 0; i < array.length - dk; i++){
				sComNum++;
				if(array[i+dk] < array[i]){
					temp = array[i+dk];
					j = i + dk;
					do{
						j -= dk;
						array[j+dk] = array[j];
						sMoveNum++;
					}while(j - dk > 0 && temp < array[j-dk]);
					array[j] = temp;
				}
			}

		}
	/**
	 * 3.6 堆排序
	 * @param {[type]} array [description]
	 * @param {[type]} ntemp [description]
	 * @param {[type]} stemp [description]
	 * @param {[type]} ttemp [description]
	 * @param {[type]} ptemp [description]
	 */
		hComNum = 0; hMoveNum = 0;
		var Heap = function(array,ntemp,stemp,ttemp,ptemp){
			this.rcd = array;
			this.n = ntemp-1;
			this.size = stemp;
			this.tag = ttemp,
			this.prior = ptemp;
			this.getN = function(){
				return this.n;
			}
			this.setN = function(num){
				this.n  = num;
			}
			this.getRcd = function(){
				return this.rcd;
			}
		}
		function greatPrior(x,y){
			return x >= y;
		}
		function lessPrior(x,y){

			return x <= y;
		}
		function swapHeapElem(heap, i, j){
			var temp;
			if(i <0 || i > heap.getN() || j < 0 || j > heap.getN()) return -1;
			hMoveNum++;
			temp = heap.getRcd()[i];
			heap.getRcd()[i] = heap.getRcd()[j];
			heap.getRcd()[j] = temp;
		}
		function shiftDown(heap,pos){
			var c, rc;
			while(pos <= Math.floor(heap.getN()/2)){
				c = Math.floor(pos*2);
				rc = Math.floor(pos*2) + 1;
				if(rc <= heap.getN() && c > 0 && heap.prior(heap.getRcd()[rc],heap.getRcd()[c])){
					c = rc;
				}
				hComNum++;	
				hComNum++;
				if(heap.prior(heap.getRcd()[pos],heap.getRcd()[c])){
					return ;
				}
				swapHeapElem(heap,pos,c);
				pos = c;
			}
		}
		function removeFirstHeap(heap){
			if(heap.getN()<=0) return -1;
		//	e = heap.getRcd()[1];//取出栈顶
			swapHeapElem(heap,1,heap.getN()); //交换栈顶和栈尾元素
			heap.setN(heap.getN()-1);
			
			if(heap.getN() > 1){
				shiftDown(heap,1);
			}
			return 1;
		}
		
		function heapSort(array){
			var i;
			hComNum = 0;
			hMoveNum = 0;
			array.unshift(300);//插入一个临时项
			heap = new Heap(array, array.length, 250, 0, greatPrior);
			for(i = Math.round((heap.getN())/2); i > 0; i--) 
				shiftDown(heap,i);
			//if(heap.getRcd()[heap.getN()] < heap.getRcd()[1]){ swapHeapElem(heap,heap.getN(),1);heap.setN(heap.getN()-1);}
			for(i = heap.getN(); i > 0 ; i--){
				removeFirstHeap(heap);
			}
			document.write("关键字比较次数"+hComNum+";<br/>");
			document.write("关键字移动次数"+hMoveNum+";<br/>");
		}
/**
 * 测试
 * 
 */
	function printf1(array1,array2,array3,array4,array5, array6){
			document.write("<div class='div_com'>");
			document.write("<h3 class='span_com'>array1的数据</h3><p>")
			for(var i = 0 ; i < array1.length ; i++){
				document.write(array1[i]+" ");
			}
			document.write("</p>");
			document.write("<h3 class='span_com'>array2的数据</h3><p>")
			for(var i = 0 ; i < array2.length ; i++){
				document.write(array2[i]+" ");
			}
			document.write("</p>");
			document.write("<h3 class='span_com'>array3的数据</h3><p>")
			for(var i = 0 ; i < array3.length ; i++){
				document.write(array3[i]+" ");
			}
			document.write("</p>");
			document.write("<h3 class='span_com'>array4的数据</h3><p>")
			for(var i = 0 ; i < array4.length ; i++){
				document.write(array4[i]+" ");
			}
			document.write("</p>");
			document.write("<h3 class='span_com'>array5的数据</h3><p>")
			for(var i = 0 ; i < array5.length ; i++){
				document.write(array5[i]+" ");
			}
			document.write("</p>");
			document.write("<h3 class='span_com'>array6的数据</h3><p>")
			for(var i = 0 ; i < array6.length ; i++){
				document.write(array6[i]+" ");
			}
			document.write("</p>");
			document.write("</div>");

	}
	function start(fun,message,array1,array2,array3,array4,array5, array6){
		document.write("<div class='div_com'><h1 class='head_com'>以下是"+message+"的</h1>");
		document.write("<br/>");
		document.write("<span class='span_com'>升序数组</span>:");
		fun(array1);

		document.write("<span class='span_com'>降序数组</span>:");
		fun(array2);

		document.write("<span class='span_com'>乱序数组</span>:");	
		fun(array3);
		
		document.write("<span class='span_com'>乱序数组</span>:");	
		fun(array4);	
		document.write("<span class='span_com'>乱序数组</span>:");		
		fun(array5);

		document.write("<span class='span_com'>乱序数组</span>:");		
		fun(array6);
		document.write("</div>");
	}

	function test(){
	//数据组1
		var array11 = createAscending();
		var array12 = createDescending();
		var array13 = createArray();
		var array14 = createArray();
		var array15 = createArray();
		var array16 = createArray();
		//数据组2,深复制数组1的数据
		var array21 = array11.concat();
		var array22 = array12.concat();
		var array23 = array13.concat();
		var array24 = array14.concat();
		var array25 = array15.concat();
		var array26 = array16.concat();
		//数据组3,深复制数组1的数据
		var array31 = array11.concat();
		var array32 = array12.concat();
		var array33 = array13.concat();
		var array34 = array14.concat();
		var array35 = array15.concat();
		var array36 = array16.concat();
		//数据组4,深复制数组1的数据
		var array41 = array11.concat();
		var array42 = array12.concat();
		var array43 = array13.concat();
		var array44 = array14.concat();
		var array45 = array15.concat();
		var array46 = array16.concat();
		//数据组5,深复制数组1的数据
		var array51 = array11.concat();
		var array52 = array12.concat();
		var array53 = array13.concat();
		var array54 = array14.concat();
		var array55 = array15.concat();
		var array56 = array16.concat();
		//数据组6,深复制数组1的数据
		var array61 = array51.concat();
		var array62 = array52.concat();
		var array63 = array53.concat();
		var array64 = array54.concat();
		var array65 = array55.concat();
		var array66 = array56.concat();
	
		printf1(array11,array12,array13,array14,array15, array16);
		start(bubbleSort,"冒泡排序",array11,array12,array13,array14,array15, array16);
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array11,array12,array13,array14,array15, array16);
		
		start(diractInsertionSort,"直接插入排序",array21,array22,array23,array24,array25,array26);
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array21,array22,array23,array24,array25,array26);
		
		start(simpleSelectionSort,"简单选择排序",array31,array32,array33,array34,array35,array36);
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array31,array32,array33,array34,array35,array36);

		start(quickSort,"快排",array41,array42,array43,array44,array45,array46);
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array41,array42,array43,array44,array45,array46);

		start(shell,"希尔排序",array51,array52,array53,array54,array55,array56);
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array51,array52,array53,array54,array55,array56);

		start(heapSort,"堆排序",array61,array62,array63,array64,array65,array66);
		array61.shift();
		array62.shift();
		array63.shift();
		array64.shift();
		array65.shift();
		array66.shift();
		document.write("<div class='div_com'><h1 class='head_com'>排序后的数组</h1></div>");
		printf1(array61,array62,array63,array64,array65,array66);
	}
	function reload1(){
		location.reload(true);
	}
test(); //调用JavaScript
posted @ 2016-05-04 19:19  ArtemisZ  阅读(148)  评论(0编辑  收藏  举报