箱子排序

// 复杂性为n+range
void BinSort(Chain<Node>& x, int range)
{
 int len=x.Length();
 Node X;
 Chain<Node> *bin;
 bin=new Chain<Node>[range+1];
 // 分配到每个箱子中
 for(int i=1;i<=len;i++)
 {
  x.Delete(1, X);
  bin[X.score].Insert(0,X);
 }
 // 从箱子中收集各元素
 for(int j=range;j>=0;j--)
 {
  while(!bin[j].IsEmpty())
  {
   bin[j].Delete(1,X);
   x.Insert(0,x);
  }
 }
 delete []bin;
}

// 箱子排序可以扩展成基数排序:
// 假定对范围0~999之间的10个整数进行排序。可以先对最低位进行range(0~9)的箱子排序,然后对第二位和第三位依次进行箱子排序。

Ref:<<数据结构,算法与应用>>P113~117

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于排序算法的测试程序设计问题。下面是一个简单的解决方案: 1. 首先,我们需要定义一个生成随机数据的函数,可以使用Python中的random模块来实现: ```python import random def generate_data(n): data = [] for i in range(n): data.append(random.randint(1, 100)) return data ``` 这个函数可以生成一个长度为n的随机数据列表,数据的范围在1到100之间。 2. 接下来,我们需要实现各种排序算法,这里给出冒泡排序、直接排序、选择排序、堆排序、快速排序和归并排序的Python实现: ```python def bubble_sort(data): n = len(data) for i in range(n): for j in range(n-i-1): if data[j] > data[j+1]: data[j], data[j+1] = data[j+1], data[j] def insertion_sort(data): n = len(data) for i in range(1, n): j = i while j > 0 and data[j] < data[j-1]: data[j], data[j-1] = data[j-1], data[j] j -= 1 def selection_sort(data): n = len(data) for i in range(n): min_idx = i for j in range(i+1, n): if data[j] < data[min_idx]: min_idx = j data[i], data[min_idx] = data[min_idx], data[i] def heap_sort(data): def heapify(data, n, i): largest = i l = 2*i + 1 r = 2*i + 2 if l < n and data[l] > data[largest]: largest = l if r < n and data[r] > data[largest]: largest = r if largest != i: data[i], data[largest] = data[largest], data[i] heapify(data, n, largest) n = len(data) for i in range(n//2 - 1, -1, -1): heapify(data, n, i) for i in range(n-1, 0, -1): data[0], data[i] = data[i], data[0] heapify(data, i, 0) def quick_sort(data): def partition(data, low, high): pivot = data[high] i = low - 1 for j in range(low, high): if data[j] < pivot: i += 1 data[i], data[j] = data[j], data[i] data[i+1], data[high] = data[high], data[i+1] return i+1 def quick_sort_helper(data, low, high): if low < high: p = partition(data, low, high) quick_sort_helper(data, low, p-1) quick_sort_helper(data, p+1, high) quick_sort_helper(data, 0, len(data)-1) def merge_sort(data): def merge(data, left, mid, right): temp = [] i = left j = mid + 1 while i <= mid and j <= right: if data[i] < data[j]: temp.append(data[i]) i += 1 else: temp.append(data[j]) j += 1 while i <= mid: temp.append(data[i]) i += 1 while j <= right: temp.append(data[j]) j += 1 for i in range(len(temp)): data[left+i] = temp[i] def merge_sort_helper(data, left, right): if left < right: mid = (left + right) // 2 merge_sort_helper(data, left, mid) merge_sort_helper(data, mid+1, right) merge(data, left, mid, right) merge_sort_helper(data, 0, len(data)-1) ``` 3. 现在我们可以编写一个测试函数,来测试各种排序算法的性能: ```python def test_sorting_algorithm(sort_func): data1 = generate_data(100) data2 = generate_data(1000) data3 = generate_data(10000) data4 = generate_data(50000) data5 = generate_data(100000) data_list = [data1, data2, data3, data4, data5] for i, data in enumerate(data_list): print(f"测试数据 {i+1}:") print(f"原始数据:{data}") sort_func(data) print(f"排序后数据:{data}") print(f"关键字比较次数:{sort_func.compares}") print(f"关键字移动次数:{sort_func.moves}") print() ``` 4. 最后,我们需要修改上面的排序算法实现,使它们能够记录关键字比较次数和移动次数。这里可以使用Python中的装饰器来实现: ```python def counting_decorator(func): def wrapper(data): wrapper.compares = 0 wrapper.moves = 0 func(data) return wrapper @counting_decorator def bubble_sort(data): ... ``` 这样,我们就可以在测试函数中打印出每种排序算法的关键字比较次数和移动次数了。 完整的测试程序代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值