插入排序
插入排序–每个元素都会与列表中的前一个元素进行比较,并将元素与较大的元素(如果有)交换,否则内部比较循环停止。由于元素是从第一个到最后一个排序的,因此每个元素都会与已经排序的列表进行比较,这“可能”减少了总体运行时间。该算法的时间复杂度为O(n^2),即与气泡多样性相同。
合并排序
合并排序–该列表被分成一个元素的组,然后这些组被成对地“合并”并同时进行比较。在我的实现中,当合并对时,将左侧的元素与右侧的元素进行比较,然后移动到结果列表;如果左侧的元素消失,则将右侧的所有元素添加到结果列表中; list(不需要进行额外的比较,因为组中的所有元素都会经过排序迭代)< br />该算法的工作非常容易并行化;合并对的阶段可以在线程中执行,等待调度程序中的迭代结束。
单线程执行算法的输出:
["John", "Alice", "Mike", "#1", "Артем", "20", "60", "60", "DoubleTrouble"]
[["John"], ["Alice"], ["Mike"], ["#1"], ["Артем"], ["20"], ["60"], ["60"], ["DoubleTrouble"]]
[["Alice", "John"], ["#1", "Mike"], ["20", "Артем"], ["60", "60"], ["DoubleTrouble"]]
[["#1", "Alice", "John", "Mike"], ["20", "60", "60", "Артем"], ["DoubleTrouble"]]
[["#1", "20", "60", "60", "Alice", "John", "Mike", "Артем"], ["DoubleTrouble"]]
["#1", "20", "60", "60", "Alice", "DoubleTrouble", "John", "Mike", "Артем"]
多线程执行算法的输出:
["John", "Alice", "Mike", "#1", "Артем", "20", "60", "60", "DoubleTrouble"]
[["John"], ["Alice"], ["Mike"], ["#1"], ["Артем"], ["20"], ["60"], ["60"], ["DoubleTrouble"]]
[["20", "Артем"], ["Alice", "John"], ["60", "60"], ["#1", "Mike"], ["DoubleTrouble"]]
[["#1", "60", "60", "Mike"], ["20", "Alice", "John", "Артем"], ["DoubleTrouble"]]
[["DoubleTrouble"], ["#1", "20", "60", "60", "Alice", "John", "Mike", "Артем"]]
["#1", "20", "60", "60", "Alice", "DoubleTrouble", "John", "Mike", "Артем"]
算法时间复杂度为O(n*log(n)),略优于O(n^2)
来源
https://en.wikipedia.org/wiki/Insertion_sort
https://en.wikipedia.org/wiki/Merge_sort
源代码
https://gitlab.com/demensdeum /algorithms/-/tree/master/sortAlgorithms/insertionSort
https://gitlab.com/demensdeum/algorithms/-/tree/master/sortAlgorithms/mergeSort