算法回锅肉——桶排序

示例代码纯粹是为了加深印象,选择的目标语言有更便捷的实现方式,另外去掉了一些假设条件检查。

#encoding:gbk

Size = 1000
arr = Array.new(Size) do	#初始化待排序数组,随机填写元素
	rand(Size)
end

def partition(a,p,r) #分片,粗糙拆分为两类
	x = a[r]
	i = p - 1
	for j in p..r - 1
		if a[j] < x
			i += 1
			a[i],a[j] = a[j],a[i]
		end
	end
	i += 1
	a[i],a[r] = a[r],a[i]
	i
end

def quick_sort(a,p,r)
	if p < r
		q = partition(a,p,r)
		quick_sort(a,p,q - 1) #递归快速排序
		quick_sort(a,q + 1,r)
	end
end

def bucket_sort(a)
	nb = a.size / 100 #桶排序对输入的特点有假设
	lb = Array.new(nb) do
		Array.new
	end
	a.each do |x| #分桶
		lb[x / 100].push x
	end
	lb.each do |b| #每桶快速排序
		quick_sort(b,0,b.size - 1)
	end
	lb.flatten #连接桶数据
end

puts arr.inspect
puts '-'*1000
arrc = arr.clone
res = bucket_sort(arrc)
puts res.inspect

输出如下:

---------- Ruby ----------
[145, 150, 114, 930, 968, 396, 607, 39, 249, 147, 887, 898, 137, 618, 161, 424, 658, 51, 325, 778, 45, 314, 26, 86, 742, 708, 639, 247, 962, 431, 320, 663, 896, 880, 548, 911, 107, 518, 306, 654, 155, 266, 626, 374, 970, 150, 46, 514, 417, 117, 380, 637, 976, 342, 740, 433, 178, 227, 491, 416, 364, 710, 102, 62, 901, 385, 557, 697, 1, 637, 370, 702, 251, 954, 900, 623, 356, 150, 386, 700, 575, 666, 318, 548, 741, 726, 754, 813, 141, 305, 963, 142, 922, 956, 551, 99, 397, 24, 986, 954, 14, 828, 528, 742, 361, 893, 402, 567, 292, 222, 142, 155, 867, 452, 567, 742, 755, 384, 505, 496, 674, 416, 314, 474, 940, 626, 193, 785, 709, 358, 922, 388, 714, 127, 543, 134, 819, 516, 247, 257, 19, 183, 900, 392, 525, 978, 301, 763, 326, 879, 190, 716, 471, 733, 695, 449, 874, 119, 617, 941, 823, 320, 536, 967, 4, 25, 720, 490, 808, 52, 602, 497, 193, 610, 994, 19, 134, 897, 991, 720, 792, 504, 906, 142, 220, 743, 948, 698, 228, 393, 538, 855, 215, 81, 647, 178, 773, 724, 863, 789, 491, 325, 179, 468, 159, 501, 193, 157, 847, 11, 903, 166, 750, 893, 71, 303, 817, 524, 530, 927, 428, 908, 61, 493, 946, 244, 448, 44, 323, 368, 978, 947, 125, 724, 721, 699, 907, 921, 237, 730, 909, 148, 348, 774, 19, 26, 916, 986, 465, 816, 37, 413, 210, 402, 178, 524, 401, 719, 755, 789, 464, 282, 134, 450, 90, 709, 885, 836, 142, 265, 864, 762, 938, 295, 176, 189, 829, 624, 629, 98, 445, 374, 379, 248, 987, 404, 374, 139, 71, 321, 209, 735, 564, 983, 813, 529, 467, 828, 495, 822, 900, 447, 828, 119, 218, 781, 117, 421, 990, 285, 306, 396, 616, 222, 750, 143, 853, 87, 877, 668, 125, 963, 464, 421, 491, 683, 443, 485, 833, 807, 894, 505, 306, 79, 73, 450, 747, 518, 231, 664, 296, 68, 911, 248, 234, 899, 595, 696, 62, 22, 316, 549, 192, 133, 554, 926, 629, 132, 352, 55, 551, 106, 7, 532, 264, 205, 205, 403, 907, 455, 530, 276, 808, 556, 557, 471, 311, 624, 15, 811, 434, 735, 858, 769, 277, 234, 485, 171, 410, 302, 358, 910, 80, 651, 288, 789, 146, 628, 688, 905, 908, 452, 68, 661, 916, 16, 839, 244, 732, 729, 414, 342, 10, 956, 535, 949, 407, 595, 812, 654, 749, 554, 192, 120, 955, 749, 652, 702, 803, 276, 902, 216, 542, 172, 344, 635, 897, 604, 885, 974, 405, 516, 440, 550, 789, 6, 44, 259, 349, 848, 277, 484, 295, 260, 385, 402, 256, 835, 176, 240, 136, 297, 976, 529, 554, 306, 403, 386, 256, 206, 640, 88, 30, 620, 904, 749, 246, 701, 389, 94, 838, 744, 730, 788, 685, 964, 983, 810, 311, 451, 447, 739, 640, 899, 675, 834, 442, 752, 262, 669, 557, 655, 611, 784, 494, 901, 914, 580, 702, 262, 9, 492, 947, 188, 917, 607, 727, 370, 980, 769, 527, 248, 664, 601, 983, 608, 652, 268, 30, 967, 18, 353, 629, 73, 3, 736, 671, 990, 494, 307, 653, 877, 849, 980, 240, 492, 981, 538, 325, 816, 265, 483, 936, 298, 828, 549, 74, 583, 21, 523, 876, 923, 402, 444, 935, 376, 125, 699, 665, 889, 831, 744, 31, 735, 300, 542, 237, 352, 159, 442, 109, 454, 912, 492, 893, 913, 942, 911, 295, 87, 85, 949, 430, 242, 508, 312, 188, 650, 303, 670, 188, 674, 914, 240, 610, 286, 291, 149, 987, 456, 383, 624, 377, 228, 129, 417, 750, 351, 98, 663, 986, 175, 873, 542, 169, 922, 469, 311, 848, 823, 126, 619, 923, 320, 500, 950, 739, 444, 920, 326, 825, 390, 76, 294, 575, 238, 545, 820, 272, 451, 791, 647, 430, 709, 356, 731, 142, 345, 499, 929, 976, 729, 278, 737, 45, 966, 548, 279, 830, 346, 125, 278, 223, 76, 288, 342, 386, 300, 780, 633, 412, 966, 991, 994, 826, 516, 218, 657, 78, 246, 171, 622, 290, 482, 631, 167, 333, 851, 433, 509, 118, 937, 746, 534, 482, 133, 572, 58, 224, 785, 865, 340, 354, 14, 769, 547, 468, 833, 903, 984, 916, 361, 338, 656, 327, 638, 557, 675, 423, 282, 694, 776, 329, 42, 897, 119, 901, 157, 533, 710, 695, 568, 158, 339, 792, 983, 696, 738, 596, 815, 94, 835, 955, 326, 469, 48, 344, 581, 226, 435, 123, 791, 260, 479, 235, 126, 78, 835, 325, 576, 777, 116, 376, 176, 631, 501, 39, 625, 818, 508, 35, 133, 693, 247, 788, 381, 630, 935, 584, 238, 809, 643, 311, 241, 453, 844, 314, 929, 483, 2, 240, 762, 138, 546, 422, 585, 120, 40, 351, 316, 438, 609, 6, 301, 744, 859, 870, 560, 556, 580, 904, 347, 72, 308, 425, 650, 667, 345, 455, 399, 814, 150, 40, 190, 117, 5
49, 202, 277, 543, 387, 132, 5, 294, 628, 21, 562, 723, 407, 663, 193, 122, 384, 432, 943, 231, 69, 861, 83, 526, 550, 854, 138, 518, 1, 898, 427, 257, 715, 884, 987, 433, 484, 1, 597, 230, 416, 287, 477, 787, 118, 918, 140, 117, 316, 480, 541, 188, 726, 872, 324, 704, 541, 291, 77, 315, 386, 868, 292, 733, 789, 814, 5, 497, 583, 817, 593, 402, 429, 812, 118, 250, 294, 727, 927, 443, 499, 762, 426, 548, 364, 441, 943, 83, 120, 881, 321, 758, 895, 617, 554, 998, 672, 774, 629, 961, 710, 427, 751, 409, 443, 772, 378, 139, 404, 472, 484, 894, 734, 573, 914, 278, 482, 866, 382, 632, 695, 107, 696, 489, 245, 428, 396, 821, 901, 670, 149, 507, 713, 110, 996, 954, 537, 549, 121, 852, 726, 585, 692, 692, 313, 530, 599, 166, 802, 496, 57, 994, 769, 388, 218, 18, 879, 198, 650, 521, 609, 136, 287, 714, 848]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[1, 1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 9, 10, 11, 14, 14, 15, 16, 18, 18, 19, 19, 19, 21, 21, 22, 24, 25, 26, 26, 30, 30, 31, 35, 37, 39, 39, 40, 40, 42, 44, 44, 45, 45, 46, 48, 51, 52, 55, 57, 58, 61, 62, 62, 68, 68, 69, 71, 71, 72, 73, 73, 74, 76, 76, 77, 78, 78, 79, 80, 81, 83, 83, 85, 86, 87, 87, 88, 90, 94, 94, 98, 98, 99, 102, 106, 107, 107, 109, 110, 114, 116, 117, 117, 117, 117, 118, 118, 118, 119, 119, 119, 120, 120, 120, 121, 122, 123, 125, 125, 125, 125, 126, 126, 127, 129, 132, 132, 133, 133, 133, 134, 134, 134, 136, 136, 137, 138, 138, 139, 139, 140, 141, 142, 142, 142, 142, 142, 143, 145, 146, 147, 148, 149, 149, 150, 150, 150, 150, 155, 155, 157, 157, 158, 159, 159, 161, 166, 166, 167, 169, 171, 171, 172, 175, 176, 176, 176, 178, 178, 178, 179, 183, 188, 188, 188, 188, 189, 190, 190, 192, 192, 193, 193, 193, 193, 198, 202, 205, 205, 206, 209, 210, 215, 216, 218, 218, 218, 220, 222, 222, 223, 224, 226, 227, 228, 228, 230, 231, 231, 234, 234, 235, 237, 237, 238, 238, 240, 240, 240, 240, 241, 242, 244, 244, 245, 246, 246, 247, 247, 247, 248, 248, 248, 249, 250, 251, 256, 256, 257, 257, 259, 260, 260, 262, 262, 264, 265, 265, 266, 268, 272, 276, 276, 277, 277, 277, 278, 278, 278, 279, 282, 282, 285, 286, 287, 287, 288, 288, 290, 291, 291, 292, 292, 294, 294, 294, 295, 295, 295, 296, 297, 298, 300, 300, 301, 301, 302, 303, 303, 305, 306, 306, 306, 306, 307, 308, 311, 311, 311, 311, 312, 313, 314, 314, 314, 315, 316, 316, 316, 318, 320, 320, 320, 321, 321, 323, 324, 325, 325, 325, 325, 326, 326, 326, 327, 329, 333, 338, 339, 340, 342, 342, 342, 344, 344, 345, 345, 346, 347, 348, 349, 351, 351, 352, 352, 353, 354, 356, 356, 358, 358, 361, 361, 364, 364, 368, 370, 370, 374, 374, 374, 376, 376, 377, 378, 379, 380, 381, 382, 383, 384, 384, 385, 385, 386, 386, 386, 386, 387, 388, 388, 389, 390, 392, 393, 396, 396, 396, 397, 399, 401, 402, 402, 402, 402, 402, 403, 403, 404, 404, 405, 407, 407, 409, 410, 412, 413, 414, 416, 416, 416, 417, 417, 421, 421, 422, 423, 424, 425, 426, 427, 427, 428, 428, 429, 430, 430, 431, 432, 433, 433, 433, 434, 435, 438, 440, 441, 442, 442, 443, 443, 443, 444, 444, 445, 447, 447, 448, 449, 450, 450, 451, 451, 452, 452, 453, 454, 455, 455, 456, 464, 464, 465, 467, 468, 468, 469, 469, 471, 471, 472, 474, 477, 479, 480, 482, 482, 482, 483, 483, 484, 484, 484, 485, 485, 489, 490, 491, 491, 491, 492, 492, 492, 493, 494, 494, 495, 496, 496, 497, 497, 499, 499, 500, 501, 501, 504, 505, 505, 507, 508, 508, 509, 514, 516, 516, 516, 518, 518, 518, 521, 523, 524, 524, 525, 526, 527, 528, 529, 529, 530, 530, 530, 532, 533, 534, 535, 536, 537, 538, 538, 541, 541, 542, 542, 542, 543, 543, 545, 546, 547, 548, 548, 548, 548, 549, 549, 549, 549, 550, 550, 551, 551, 554, 554, 554, 554, 556, 556, 557, 557, 557, 557, 560, 562, 564, 567, 567, 568, 572, 573, 575, 575, 576, 580, 580, 581, 583, 583, 584, 585, 585, 593, 595, 595, 596, 597, 599, 601, 602, 604, 607, 607, 608, 609, 609, 610, 610, 611, 616, 617, 617, 618, 619, 620, 622, 623, 624, 624, 624, 625, 626, 626, 628, 628, 629, 629, 629, 629, 630, 631, 631, 632, 633, 635, 637, 637, 638, 639, 640, 640, 643, 647, 647, 650, 650, 650, 651, 652, 652, 653, 654, 654, 655, 656, 657, 658, 661, 663, 663, 663, 664, 664, 665, 666, 667, 668, 669, 670, 670, 671, 672, 674, 674, 675, 675, 683, 685, 688, 692, 692, 693, 694, 695, 695, 695, 696, 696, 696, 697, 698, 699, 699, 700, 701, 702, 702, 702, 704, 708, 709, 709, 709, 710, 710, 710, 713, 714, 714, 715, 716, 719, 720, 720, 721, 723, 724, 724, 726, 726, 726, 727, 727, 729, 729, 730, 730, 731, 732, 733, 733, 734, 735, 735, 735, 736, 737, 738, 739, 739, 740, 741, 742, 742, 742, 743, 744, 744, 744, 746, 747, 749, 749, 749, 750, 750, 750, 751, 752, 754, 755, 755, 758, 762, 762, 762, 763, 769, 769, 769, 769, 772, 773, 774, 774, 776, 777, 778, 780, 781, 784, 785, 785, 787, 788, 788, 789, 789, 789, 789, 789, 791, 791, 792, 792, 802, 803, 807, 808, 808, 809, 810, 811, 812, 812, 813, 813, 814, 814, 815, 816, 816, 817, 817, 818, 819, 820, 821, 822, 823, 823, 825, 826, 828, 828, 828, 828, 829, 830, 831, 833, 833, 834, 835, 835, 835, 836, 8
38, 839, 844, 847, 848, 848, 848, 849, 851, 852, 853, 854, 855, 858, 859, 861, 863, 864, 865, 866, 867, 868, 870, 872, 873, 874, 876, 877, 877, 879, 879, 880, 881, 884, 885, 885, 887, 889, 893, 893, 893, 894, 894, 895, 896, 897, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 901, 901, 902, 903, 903, 904, 904, 905, 906, 907, 907, 908, 908, 909, 910, 911, 911, 911, 912, 913, 914, 914, 914, 916, 916, 916, 917, 918, 920, 921, 922, 922, 922, 923, 923, 926, 927, 927, 929, 929, 930, 935, 935, 936, 937, 938, 940, 941, 942, 943, 943, 946, 947, 947, 948, 949, 949, 950, 954, 954, 954, 955, 955, 956, 956, 961, 962, 963, 963, 964, 966, 966, 967, 967, 968, 970, 974, 976, 976, 976, 978, 978, 980, 980, 981, 983, 983, 983, 983, 984, 986, 986, 986, 987, 987, 987, 990, 990, 991, 991, 994, 994, 994, 996, 998]

Output completed (0 sec consumed) - Normal Termination

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值