按长度和字母顺序对字符串进行基数排序

问题描述

我正在尝试为字符串实现基数排序,但是我只能通过字符串长度来实现。我想按长度和字母顺序对字符串数组进行排序。甚至可以用基数排序来做吗?

这是我的代码

error - ReferenceError: document is not defined
    at Module../node_modules/bootstrap/dist/js/bootstrap.esm.min.js (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:195:2902)    
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at Module../src/pages/_app.jsx (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:1070:107)
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at Object.0 (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:1115:18)
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:91:18
    at Object.<anonymous> (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:94:10)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at requirePage (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\node_modules\next\dist\next-server\server\require.js:1:1184)
    at loadComponents (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\node_modules\next\dist\next-server\server\load-components.js:1:865)
ReferenceError: document is not defined
    at Module../node_modules/bootstrap/dist/js/bootstrap.esm.min.js (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:195:2902)    
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at Module../src/pages/_app.jsx (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:1070:107)
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at Object.0 (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:1115:18)
    at __webpack_require__ (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:23:31)
    at C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:91:18
    at Object.<anonymous> (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\.next\server\pages\_app.js:94:10)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at requirePage (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\node_modules\next\dist\next-server\server\require.js:1:1184)
    at loadComponents (C:\Users\Ali Alperen Arıkan\Desktop\WebDevelopment\WebDevelopment\Projelerim\next-mongo\node_modules\next\dist\next-server\server\load-components.js:1:865)

我的示例数组是这样的

def flatten(arr):
    flatten_arr = []
    for item_arr in arr:
        for item in item_arr:
            flatten_arr.append(item)
    return flatten_arr


count_size = 256


def get_max_length(book_content_arr):
    size = 0
    for word in book_content_arr:
        word_size = len(word)
        if word_size > size:
            size = word_size
    return size


def radix_sort(arr):
    word_length = get_max_length(arr)
    for index in range(0,word_length):
        buckets = [[] for i in range(count_size)]
        for item in arr:
            if len(item) > index:
                num = ord(item[index])
                buckets[num].append(item)
            else:
                buckets[0].append(item)

        arr = flatten(buckets)
    return arr
    
    
example = ["A","Z","AB","EWASADAS","BY","SDA" "ZA","BD","BA","DSADSA","BZ","KA","ES"]
print(radix_sort(example))

以及预期的输出

example = ["A","ES"]

解决方法

似乎我能够解决它。

我只是根据它们的大小将单词放入桶中,然后我使用常规基数排序对每个桶进行排序,计数排序作为子例程,然后我将数组展平。

我正在发布代码,以便它可能对某人有用

signs = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]  
def flatten(arr):
    flatten_arr = []
    for item_arr in arr:
        for item in item_arr:
            flatten_arr.append(item)
    return flatten_arr


def get_max_length(arr):
    size = 0
    for word in arr:
        word_size = len(word)
        if word_size > size:
            size = word_size
    return size

def counting_sort_for_letters(arr,index):
    count = [0] * len(signs)
    output = [0] * len(arr)

    for item in arr:
        idx = signs.index(item[index])
        count[idx] += 1

    for i in range(1,len(count)):
        count[i] += count[i - 1]

    for j in range(len(arr) - 1,-1,-1):
        idx = signs.index(arr[j][index])
        count[idx] -= 1
        output[count[idx]] = arr[j]
    return output


def radix_sort(arr,world_length):
    for i in range(world_length - 1,-1):
        arr = counting_sort_for_letters(arr,i)
    return arr
    

def custom_sort(arr):
    word_length = get_max_length(arr)
    buckets = [[] for i in range(word_length)]
    for item in arr:
        num = len(item) - 1
        buckets[num].append(item)
    for j in range(0,len(buckets)):
        buckets[j] = radix_sort(buckets[j],j + 1)
        
    arr = flatten(buckets)
    return arr
    
    
example = ["A","Z","AB","EWASADAS","BY","SDA" "ZA","BD","BA","DSADSA","BZ","KA","ES"]
print(custom_sort(example))