楼主把字符串和数字的比较搞反了.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <table id="tblSort" width="600" border="0" cellspacing="0" cellpadding="0">
            <thead>排序</thead>
            <tbody>
                <tr><td>dsf</td></tr>
                <tr><td>bb</td></tr>
                <tr><td>asd</td></tr>
                <tr><td>zz</td></tr>
                <tr><td>oo</td></tr>
            </tbody>
        </table>
    </body>
    <script>
        function sorttable(id){
            var tab = document.getElementById(id)
            var tbody = tab.tBodies[0]
            var hang = tbody.rows
            var arr = new Array()
            for (var i = 0; i < hang.length; i++) {
                arr.push(hang[i])
            }
            if (typeof(arr[0]) == "number") {
                arr.sort(compareN)
            }
            else {
                arr.sort(compareA)
            }
            var suipian = document.createDocumentFragment();
            for (var i = 0; i < arr.length; i++) {
                suipian.appendChild(arr[i])
            }
            tbody.appendChild(suipian)
            function compareN(arr1, arr2){
                var a1 = arr1.cells[0].firstChild.nodeValue
                var a2 = arr2.cells[0].firstChild.nodeValue
                return a1 - a2;
            }
            function compareA(arr1, arr2){
                var a1 = arr1.cells[0].firstChild.nodeValue;
                var a2 = arr2.cells[0].firstChild.nodeValue;
                return ( a1.localeCompare(a2));
            }
        }
        sorttable("tblSort")

    </script>
</html>