排序算法----计数排序

假设现在有n个数需要进行从小到大的排序,现在使用计数排序方法进行实现。
假设这n个数为[9,7,28,76,3,1,55,7]。

a.第一步,得到n个数中最大的数k,然后声明一个大小为k+1的空hash表。
在举例中最大的数为76,则声明一个大小为77的hash1表如下:
{
“0”:undefined,
“1”:undefined,
……
”76”:undefined
}

b.第二步,读取这n个数,读到一个数时,将hash1中的该序号的值加1。
在举例中,读到9时,hash1[9]的值为undefined,则将值置为1,如下:
{
“0”:undefined,
“1”:undefined,
“2”:undefined,
“3”:undefined,
“4”:undefined,
“5”:undefined,
“6”:undefined,
“7”:undefined,
“8”:undefined,
“9”:1,
“10”:undefined,
……
”76”:undefined
}
读到最后一个7时,hash1[7]的值为1,则将值置为2,如下:
{
“0”:undefined,
“1”:1,
“2”:undefined,
“3”:1,
“4”:undefined,
“5”:undefined,
“6”:undefined,
“7”:2,
“8”:undefined,
“9”:1,
“10”:undefined,
……
”76”:1
}

c.第三步,创建一个大小为n的数组result。读取hash1,查看key值和对应的value值,value值是undefined时,跳过不处理;value值不是undefined时,是多少就往数组中存几个key值。
在举例中,hash1的值如下:
{
“0”:undefined,
“1”:1,
“2”:undefined,
“3”:1,
“4”:undefined,
“5”:undefined,
“6”:undefined,
“7”:2,
“8”:undefined,
“9”:1,
“10”:undefined,
……
”28”:1,
……
“55”:1,
…….
”76”:1
}
从key为0开始读取,
hash1[0]为undefined,跳过;
hash1[1]为1,往结果列表中存一个1;
。。。。。
hash1[7]为2,往结果列表中存两个7;
。。。。
最后结果为[1,3,7,7,9,28,55,76]

实现伪代码如下:

var startArr = [9,7,28,76,3,1,55,7]
var maxNum = findMax(startArr)
var hash1[maxNum+1] = undefined
for(var i = 0; i < startArr.length ; ++i)
{
    hash1[startArr[i]] = 1;
}

var resultArr;
for(var i = 0; i < maxNum ; ++i)
{
    if(hash1[i] != undefined)
    {
        var count = hash1[i];
        var pushCount = 0;
        while(pushCount < count)
        {
            resultArr.push(i);    
            pushCount++;
        }
    }
}

你可能感兴趣的:(排序算法----计数排序)