数据结构与算法-排序(二)

来源:互联网 发布:天尚网络机顶盒遥控器 编辑:程序博客网 时间:2024/06/07 07:44

希尔排序


  • 基本排序

将原本有大量记录数的记录进行分组。分割成若干序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录执行一次直接插入排序。其时间复杂度为O(n**3/2),突破了O(n*n)。

快速排序


  • 基本思想

快速排序是基于一种“二分”的思想,相比较冒泡排序,总的比较和交换的次数减少。核心是设置基准点,跳跃式交换,平均时间复杂度为O(NlogN)。

代码实现(python)

import randomdef shell_sort(test_list):    increment = len(test_list)    while increment > 1:        # increment分割的序列        increment = increment/5 + 1        # 以下就是直接插入排序的代码         for i in range(increment, len(test_list)):            # 每一个子序列都设定一个基准            temp = test_list[i]            j = i - 1            while j >= 0 and test_list[j] > temp:                test_list[j + 1] = test_list[j]                j -= 1            test_list[j + 1] = temp    return test_listdef quick_sort(arr, left, right):    if left > right:        return    # temp存的基准数    temp = arr[left]    pivot_index = left    pivot_end = right    while pivot_index != pivot_end:        # 先从右往左找大于基准数的数        while arr[pivot_end] >= temp and pivot_index < pivot_end:            pivot_end -= 1        # 再从左往右找小于基准数的数        while arr[pivot_index] <= temp and pivot_index < pivot_end:            pivot_index += 1        # 交换两个数在数组中的位置        if pivot_index < pivot_end:            arr[pivot_index], arr[pivot_end] = arr[pivot_end], arr[pivot_index]    # 将基准位置归位    arr[left], arr[pivot_index] = arr[pivot_index], arr[left]    # 继续处理左边的,这是一个递归的过程    quick_sort(arr, left, pivot_index - 1)    # 继续处理右边的,这是一个递归的过程    quick_sort(arr, pivot_index + 1, right)    return arrif __name__ == '__main__':    quick_list = [random.randint(1, 100) for _ in range(100)]    print(quick_sort(quick_list, 0, len(quick_list)-1))    shell_list = [random.randint(1, 100) for _ in range(100)]    print(quick_sort(shell_list, 0, len(shell_list)-1))
0 0