用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