1.sorts method python (7)counting_sort

計數排序Counting sort 原理:

https://blog.csdn.net/weililansehudiefei/article/details/71941188

my stupid code:

# -*- coding: utf-8 -*-
"""
Created on Wed Aug 14 14:47:01 2019

@author: zhang
"""

import numpy as np

def counting_sort(data):
        data_num = len(data)
        data_index = [0]*data_num
        data_final = list(np.full([data_num], np.nan))
        for i in range(data_num):
                for j in range(data_num):
                        if i!=j and data[i]>data[j]:
                                data_index[i] = data_index[i]+1
                data_temp = data_final[data_index[i]]                
                while  np.isnan(data_temp)==False:  #if data list have two same data
                        data_index[i] = data_index[i]+1
                        data_temp = data_final[data_index[i]]  
                data_final[data_index[i]] = data[i]

        return data_final
        
if __name__ =='__main__':        
         data = [10,20,50,3,5,7,9,11,88,55,77,56,1,2,4,555,19, 25, 26, 29 ,38 ,50 ,80, 91 ,86, 78 ,66 ,46, 32 ,19 ,15 , 7]
         #data = [8,4, 3, 7, 6, 5, 2 ,1,1]
         data_num = len(data)

         data = counting_sort(data)

answer:

"""
This is pure python implementation of counting sort algorithm
For doctests run following command:
python -m doctest -v counting_sort.py
or
python3 -m doctest -v counting_sort.py
For manual testing run:
python counting_sort.py
"""

from __future__ import print_function


def counting_sort(collection):
    """Pure implementation of counting sort algorithm in Python
    :param collection: some mutable ordered collection with heterogeneous
    comparable items inside
    :return: the same collection ordered by ascending
    Examples:
    >>> counting_sort([0, 5, 3, 2, 2])
    [0, 2, 2, 3, 5]
    >>> counting_sort([])
    []
    >>> counting_sort([-2, -5, -45])
    [-45, -5, -2]
    """
    # if the collection is empty, returns empty
    if collection == []:
        return []

    # get some information about the collection
    coll_len = len(collection)
    coll_max = max(collection)
    coll_min = min(collection)

    # create the counting array
    counting_arr_length = coll_max + 1 - coll_min
    counting_arr = [0] * counting_arr_length

    # count how much a number appears in the collection
    for number in collection:
        counting_arr[number - coll_min] += 1

    # sum each position with it's predecessors. now, counting_arr[i] tells
    # us how many elements <= i has in the collection
    for i in range(1, counting_arr_length):
        counting_arr[i] = counting_arr[i] + counting_arr[i-1]

    # create the output collection
    ordered = [0] * coll_len

    # place the elements in the output, respecting the original order (stable
    # sort) from end to begin, updating counting_arr
    for i in reversed(range(0, coll_len)):
        ordered[counting_arr[collection[i] - coll_min]-1] = collection[i]
        counting_arr[collection[i] - coll_min] -= 1

    return ordered

def counting_sort_string(string):
    return ''.join([chr(i) for i in counting_sort([ord(c) for c in string])])


if __name__ == '__main__':
    # Test string sort
    assert "eghhiiinrsssttt" == counting_sort_string("thisisthestring")

    try:
        raw_input          # Python 2
    except NameError:
        raw_input = input  # Python 3

    user_input = raw_input('Enter numbers separated by a comma:\n').strip()
    unsorted = [int(item) for item in user_input.split(',')]
    print(counting_sort(unsorted))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章