排序算法——桶排序

来源:互联网 发布:无人机pos数据 编辑:程序博客网 时间:2024/06/06 03:48

核心思想:对于被排序的数组,将数组元素记录在新的数组中。记录方法:如果当前元素的值为x,那么新数组newarray[x]这个位置加一。最后按照顺序从新数组中取下标。这个新数组的长度为原数组中元素的最大值。

例如:

nums={1,3,2,5}

新建一个数组长度为5

newarray={0,0,0,0,0}

这个新数组全部放零

第一个元素为1,所以newarray[1]这个位置加一

第二个元素为3,所以newarray[3]这个位置加一

第三个元素为2,所以newarray[2]这个位置加一

第四个元素为5,所以newarray[5]这个位置加一

最后得到一个新数组:

newarray={0,1,1,1,0,1}

在按照顺序取newarray的下标,newarray的值表示取下标的次数,这里由于元素没有重复,所以全部都只取了一次。给出的示例中有元素发生重复的情况。如果newarray[i]的值是0,就跳过这个下标。

取元素后的结果:

result={1,2,3,5}

总结:这种排序方法的优势在于速度很快,比快速排序速度还快。时间复杂度只有O(n),遍历一次数组就能完成排序。缺点在于所占用的存储空间可能会非常大,因为新数组的长度取决于原数组中的最大值,如果原数组中的值比较分散且值比较大,就会造成存储空间的浪费。例如原数组只有两个值0和10000,为了比较这两个值,新数组的长度必须为10000,这就浪费了很多的存储空间。


示例代码:

package algorithms;//桶排序示例public class Example {public static void sortmethod(int nums[]) {int max = nums[0];for (int i = 0; i < nums.length; i++)//先找出数组中最大的数字,确定新数组的长度if (nums[i] > max)max = nums[i];int[] newarray = new int[max + 1];for (int i = 1; i < newarray.length; i++)//新数组全部置零newarray[i] = 0;for (int i = 0; i < nums.length; i++)//更新新数组newarray[nums[i]]++;for (int i = 0; i < newarray.length; i++) {//按照规则从新数组取出数字while (newarray[i] >= 1) {System.out.print(i);newarray[i]--;}}}public static void main(String args[]) {int ex[] = { 1, 3, 2, 4, 6, 2, 5, 7, 9, 3, 3 };sortmethod(ex);}}




0 0
原创粉丝点击