随机产生1000-10000个数,分别用希尔排序、快速排序、归并排序和基数排序方法进行排序,
时间: 2024-03-23 12:43:01 浏览: 108
随机产生若干个数,并插入排序
好的,我可以为您解答这个问题。
首先,我们需要了解这四种排序算法的实现过程和原理。
1. 希尔排序(Shell Sort)
希尔排序是一种插入排序的改进版本,它通过将待排序的数组元素按照一定间隔分组,对每组使用插入排序算法排序,然后逐步缩小间隔,直至间隔为1时完成排序。希尔排序的时间复杂度约为O(n^1.3),比插入排序的O(n^2)要快。
2. 快速排序(Quick Sort)
快速排序是一种分治算法,它通过选取一个基准元素,将待排序的数组分成两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对两部分进行排序。快速排序的时间复杂度约为O(nlogn),但是在最坏情况下(即待排序数组已经有序或者几乎有序),时间复杂度会退化为O(n^2)。
3. 归并排序(Merge Sort)
归并排序也是一种分治算法,它将待排序的数组分成两个部分,分别排序,然后将两个有序的子数组合并成一个有序的数组。归并排序的时间复杂度为O(nlogn),但是它需要额外的空间来存储排序后的数组。
4. 基数排序(Radix Sort)
基数排序是一种非比较排序算法,它根据元素的位数将待排序的数组分成多个桶,对每个桶中的元素进行排序,然后将所有桶中的元素按照顺序依次连接起来。基数排序的时间复杂度为O(d(n+k)),其中d为数字位数,k为进制数。
接下来,我们可以使用Python语言实现这四种排序算法,并对随机产生的1000-10000个数进行排序。
```python
import random
import time
# 希尔排序
def shell_sort(arr):
n = len(arr)
gap = n // 2
while gap > 0:
for i in range(gap, n):
temp = arr[i]
j = i
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2
# 快速排序
def quick_sort(arr, left, right):
if left >= right:
return
pivot = arr[left]
i, j = left, right
while i < j:
while i < j and arr[j] >= pivot:
j -= 1
while i < j and arr[i] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[left], arr[i] = arr[i], arr[left]
quick_sort(arr, left, i - 1)
quick_sort(arr, i + 1, right)
# 归并排序
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
res = []
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
res += left[i:]
res += right[j:]
return res
# 基数排序
def radix_sort(arr):
radix = 10
max_digit = len(str(max(arr)))
for i in range(max_digit):
buckets = [[] for _ in range(radix)]
for num in arr:
buckets[num // (radix ** i) % radix].append(num)
arr.clear()
for bucket in buckets:
arr += bucket
# 生成随机数
n = random.randint(1000, 10000)
arr = [random.randint(-10000, 10000) for _ in range(n)]
# 希尔排序
start = time.time()
shell_sort(arr)
end = time.time()
print("希尔排序用时:", end - start)
# 快速排序
start = time.time()
quick_sort(arr, 0, len(arr) - 1)
end = time.time()
print("快速排序用时:", end - start)
# 归并排序
start = time.time()
arr = merge_sort(arr)
end = time.time()
print("归并排序用时:", end - start)
# 基数排序
start = time.time()
radix_sort(arr)
end = time.time()
print("基数排序用时:", end - start)
```
运行以上代码,可以得到每种排序算法的用时。注意,由于基数排序需要将数据转换为字符串类型,因此它的排序结果与其他排序算法的结果可能略有不同。
阅读全文