随机产生100 个整数构成的序列,分别以直接插入、希尔、快速、归并等排序算法排序,并统计各自的比较次数。
时间: 2023-06-05 20:47:57 浏览: 199
首先,需要生成一个包含100个随机整数的序列。可以使用Python中的random模块来实现:
```python
import random
lst = [random.randint(1, 100) for _ in range(100)]
```
接下来,可以使用四种不同的排序算法对这个序列进行排序,并统计比较次数。
1. 直接插入排序
直接插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
```python
def insertion_sort(lst):
count =
for i in range(1, len(lst)):
j = i - 1
key = lst[i]
while j >= and lst[j] > key:
lst[j+1] = lst[j]
j -= 1
count += 1
lst[j+1] = key
return count
```
2. 希尔排序
希尔排序是插入排序的一种改进,它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,从而达到排序的目的。
```python
def shell_sort(lst):
count =
n = len(lst)
gap = n // 2
while gap > :
for i in range(gap, n):
j = i
while j >= gap and lst[j-gap] > lst[j]:
lst[j-gap], lst[j] = lst[j], lst[j-gap]
j -= gap
count += 1
gap //= 2
return count
```
3. 快速排序
快速排序是一种分治的排序算法,它通过将一个序列分成两个子序列,其中一个子序列的所有元素都比另一个子序列的所有元素小,然后递归地对两个子序列进行排序,最终得到一个有序序列。
```python
def quick_sort(lst):
count =
if len(lst) <= 1:
return count
pivot = lst[]
left = [x for x in lst[1:] if x < pivot]
right = [x for x in lst[1:] if x >= pivot]
count += len(left) + len(right)
return count + quick_sort(left) + quick_sort(right)
```
4. 归并排序
归并排序是一种分治的排序算法,它将一个序列分成两个子序列,然后递归地对两个子序列进行排序,最后将两个有序子序列合并成一个有序序列。
```python
def merge_sort(lst):
count =
if len(lst) <= 1:
return count
mid = len(lst) // 2
left = lst[:mid]
right = lst[mid:]
count += merge_sort(left) + merge_sort(right)
i = j = k =
while i < len(left) and j < len(right):
if left[i] < right[j]:
lst[k] = left[i]
i += 1
else:
lst[k] = right[j]
j += 1
k += 1
count += 1
while i < len(left):
lst[k] = left[i]
i += 1
k += 1
while j < len(right):
lst[k] = right[j]
j += 1
k += 1
return count
```
最后,可以调用这些排序函数,并输出它们的比较次数:
```python
print("直接插入排序比较次数:", insertion_sort(lst))
print("希尔排序比较次数:", shell_sort(lst))
print("快速排序比较次数:", quick_sort(lst))
print("归并排序比较次数:", merge_sort(lst))
```
阅读全文