一个姓名按照笔画排序的页面

来源:互联网 发布:手机淘宝找小二 编辑:程序博客网 时间:2024/04/28 03:13
写了一个姓名按照笔画排序的页面, 共享一下。
<body onload="readDBFile();">
<table>
    
<tr>
        
<td>
            
<textarea id="srcStr" cols="60" rows="20"></textarea>
        
</td>
        
<td>
            
<button onclick="getVal();">排序>></button>
        
</td>
        
<td>
            
<textarea id="descStr" cols="60" rows="20" readonly="true"></textarea>
        
</td>
    
</tr>
    
<tr>
        
<td colspan="3">
            不能排序的姓名有:
<font color="red"><a id="descript"></a></font>
        
</td>
    
</tr>
    
<tr>
        
<td colspan="3">
            
<font color="green">说   明 <br>
一、姓按字的画数多少排列。同画数内的姓字按起笔横、竖、撇、捺、折的顺序排列,画数和笔形相同的字,按字形结构,先左右形字,再上下形字,后整体字。如:同是八画的字,“明”在先,“冒”次之,“国”在后。
<br>
二、姓字相同的依次看名的第二、第三字,先看画数,后看起笔顺序,再看笔形。两个字的姓名,视为第二个字为零画。
<br>
三、复姓字也按第一个字笔画画数多少排列,笔画相同的按笔形顺序排列。
<br>
四、姓名与姓名之间用半角逗号隔开。如:张三,李四
</font>
        
</td>
    
</tr>
</table>
</body>
<script>
    
var ht = new HashTable();
    
var errorNameArr = new Array();
    
var nameArr = new Array();
    
function readDBFile()
    
{
        
var xingStr = getXingStr();
        
var xingArr = xingStr.split(",");
        
var xingLen = xingArr.length;
        
for(var i=0;i<xingLen;i++)
        
{
            
var e = new HashTableElement();
            e.key 
= xingArr[i];
            e.code 
= i;
            ht.Insert(e);
        }

    }

    
    
function getVal()
    
{
        
var xingSrc = document.all.srcStr.value;
        
if(xingSrc != "")
        
{
            
var srcArr = xingSrc.split(",");
            
var srcLen = srcArr.length;
            
var errorNum = 0;
            
var nameNum = 0;
            
for(var i=0;i<srcLen;i++)
            
{
                
var seq ;
                
if(srcArr[i].length >= 3 )
                
{//先判断三个字的姓
                    seq = ht.Search(srcArr[i].substring(0,3));
                    
if(seq == "" || seq == null)
                    
{
                        seq 
= ht.Search(srcArr[i].substring(0,2));
                        
if(seq == "" || seq == null)
                        
{
                            seq 
= ht.Search(srcArr[i].substring(0,1));
                        }

                    }

                }

                
else if(srcArr[i].length > 1 && srcArr[i].length <= 2 )
                
{//先判断两个字的姓
                    seq = ht.Search(srcArr[i].substring(0,2));
                    
if(seq == "" || seq == null)
                    
{
                        seq 
= ht.Search(srcArr[i].substring(0,1));
                    }

                }

                
else if(srcArr[i].length == 1)
                
{
                    seq 
= ht.Search(srcArr[i].substring(0,1));
                }

                
                
                
if(seq == "" || seq == null)
                
{
                    errorNameArr[errorNum] 
= srcArr[i];
                    errorNum
++;
                }

                
else
                
{
                    
var xingObj = new Object();
                    xingObj.name 
= srcArr[i];
                    xingObj.seq 
= seq + srcArr[i].length;
                    
//nameArr[nameNum] = new Object();
                    nameArr[nameNum] = xingObj;
                    nameNum
++;
                }
            
                
            }

            
            
//把排序后的姓名放到desc中
            var nameNewArr = ShellSort(nameArr);
            
if(nameNewArr != null)
            
{
                
var newLen = nameNewArr.length;
                
var descStr = ""
                
for(var i=0;i<newLen;i++)
                
{
                    descStr 
= descStr + nameNewArr[i].name + ",";
                }

                document.all.descStr.value 
= descStr.substring(0,descStr.length-1);
            }

            
            
//把不能排序的姓名列出来
            if(errorNameArr != null)
            
{
                
var newLen = errorNameArr.length;
                
var descStr = ""
                
for(var i=0;i<newLen;i++)
                
{
                    descStr 
= descStr + errorNameArr[i] + ",";
                }

                document.all.descript.innerHTML 
= descStr.substring(0,descStr.length-1);
            }

        }

    }

    
    
     
function ShellSort(arr) //插入排序->希儿排序
      var st = new Date();
      
var increment = arr.length;
      
do {
       increment 
= (increment/3|0+ 1;
       arr 
= ShellPass(arr, increment);
      }

      
while (increment > 1)
    
      status 
= (new Date() - st) + ' ms';
      
return arr;
     }

     
function ShellPass(arr, d) //希儿排序分段执行函数
      var temp, j;
      
for(var i=d; i<arr.length; i++{
       
if((arr[i].seq) < (arr[i-d].seq)) {
        temp 
= arr[i]; j = i-d;
        
do {
         arr[j
+d] = arr[j];
         j 
= j-d;
        }

        
while (j>-1 && (temp.seq) < (arr[j].seq));
        arr[j
+d] = temp;
       }
//endif
      }

      
return arr;
     }

    
    
    
    
    
function HashTableElement()
    
{
        
this.key = null;
        
this.code = null;
    }

    
    
function HashTable()
    
{
        
this.ht = new Array(4099);
    
        
this.Search = function(keyword)
        
{
            
var arr = this.ht[keyword%4099];
            
if(typeof(arr) != "undefined")
            
{
                
for(i = 0; i < arr.length; i ++)
                
{
                    
if(arr[i].key == keyword) return arr[i].code;
                }

            }

            
return null;
        }

    
        
this.Insert = function(e)
        
{
            
var arr = this.ht[e.key%4099];
            
if(typeof(arr) == "undefined")
            
{
                arr 
= new Array();
                arr[
0= e;
                
this.ht[e.key%4099= arr;
            }

            
else
            
{
                arr[arr.length] 
= e;
            }

        }

    }

    
    
    
function getXingStr()
    
{
        
return ""
             
+ "丁,七,卜,刀,刁"
             
+ "干,于,土,大,万,万俟,寸,上官,山,么,千,广,弓,卫,马子车,习"
             
+ "丰,王,天,井,元,韦,云,专,扎,木,支,不,太叔,尤,车,区牙,比,瓦,戈,长孙,巨,日,贝,牛,毛,仁,仉,仇,化,从,丹,今,仓,公,公西,公羊,公冶,公良,公孙,乌,殳,勾,凤,卞,六,文,方,亢,火,计,尹,孔,巴,邓,双,毋,水"
             
+ "玉,未,正,甘,艾,古,节,左,左丘,厉,石,布,龙,平,东,东门,东郭,东方,占,卢,帅,归,申,申屠,叶,田,由冉,央,史,只,生,付,丘,白,仝,丛,令狐,印,包,乐,乐正,邝,立,玄,闪,兰宁,冯,司,司徒,司寇,司空,司马,弘,召,尼,皮,边,尕"
             
+ "耒,邢,戎,吉,巩,朴,权,亚,西,西门,有,百,百里,达,成,夹谷,匡,扬,毕,过,师,曲,吕,则,肉,年,朱,竹,乔,伍,伏,仲,仲孙,任,华,仰,伉伊,向,后,全,危,多,邬,庄,刘,齐,衣,充,闯,羊,羊舌,羊角,关,米,江,池汝,汤,宇文,安,军,冰,祁,许,农,寻,那,阮,阳,阴,牟,买,红,纪,孙"
             
+ "寿,麦,玛,远,运,赤,贡,却,芮,花,苍,严,克,劳,苏,杜,巫,巫马,李,杨,甫,邴,束,励,邳,来,扶,连轩辕,步,肖,时,吴,旷,员,别,岑,秀,利,邱,何,伯,佟,佘,余,谷,邸,狄,邹,言,享,库,应,辛,闵,怀,忻,况,冷,汪,沙,沃,沧,汲,沈,完,宋,罕,良,初,迟,张,陆,阿,陈,邵,邰,纳"
             
+ "青,武,幸,苗,苟,苑,范,茅,林,松,杭,郁,郏,拓拔,欧,欧阳,郅,卓,虎,尚,国,昌,畅,明,果,易,典,呼,呼延,迪,岩,罗,帕,凯,贯,牧,季,和,竺,佴,岳,侬,金,郄,周,鱼,庞,庚,底,府,於,郑,羌,单,单于,冼,法,宗,宝,宠,官,宛,空,宓,郎,房,居,屈,练,经,孟,终"
             
+ "封,项,赵,贲,郝,荆,茜,草,荀,荣,胡,茹,药,柯,查,相,柏,柳,郦,咸,南,南门,,南宫,战,是,贵,蚁,哈,钟,钟离,钦,钮,郜,种,秋,笃,段,段干,修,皇甫,禹,侯,律,须,俞,郗,郤,昝,逄,饶,施,恽,恰,闻,闻人,闾丘,姜,娄,首,养,洪,宣,宦,宫,冠,祖,祝,费,胥,姚,贺,勇,羿,骆,骈"
             
+ "秦,敖,班,载,袁,都,耿,聂,莫,莘,晋,桂,桓,格,索,栗,贾,夏,夏侯,热,原,顾,列,顿,柴,党,晁,晏,哨,钱,铁,倪,皋,徐,殷,爱,奚,翁,卿,栾,高,郭,席,唐,竞,郯,浩,凌,资,益,浦,海,涂,浣,家,宾,容,宰,宰父,诸,诸葛,谈,郎,展,陶,姬,通,能,桑"
             
+ "排,理,堵,教,黄,菅,萧,萨,梅,曹,戚,龚,盛,常,晨,鄂,唯,啜,崔,崇,铫,银,笪,符,第五,盘,庹,麻,瘐,康,鹿,章,商,阎,盖,淳于,淡,梁,梁丘,寇,宿,谌,扈,逮,尉,尉迟,屠,隋,隆,续,绳,巢"
             
+ "琴,越,喜,彭,斯,葛,董,蒋,蒉,韩,辜,森,惠,覃,粟,揭,辉,戢,景,喻,黑,嵇,程,税,傅,焦,储,舒,鲁,赓,童,羡,普,尊,曾,湛,温,滑,游,富,禄,谢,强,疏,隗,缑"
             
+ "鄢,靳,蓝,蒯,蓟,蓬,蒲,蒙,楚,楼,裘,赖,甄,雷,訾,虞,路,筱,简,微生,詹,鲍,解,廉,裔,靖,新,雍,阙,慎,满,溥,窦,福,褚"
             
+ "赫,赫连,綦,綦母,慕,慕容,蔡,蔚,蔺,臧,裴,管,鲜于,雒,廖,韵,端木,阚,漆,漆雕,赛,谭,谯,暨,翟,熊,缪"
             
+ "麴,燕,樊,暴,颛孙,墨,稽,黎,腾,颜,翦,潘"
             
+ "薛,薄,融,霍,遽,冀,穆,衡,澹台"
             
+ "戴,鞠,檀,糜,濮,濮阳,蹇"
             
+ ""
             
+ "壤驷,酆,耀,籍"
             
+ "露,夔"
             
+ "囊,鬻";
    }

</script>