冒泡排序与选择排序

来源:互联网 发布:淘宝店装修图片尺寸 编辑:程序博客网 时间:2024/06/05 07:40

以前只是大致知道冒泡排序和选择排序是怎么排的,现在想先从最基本的冒泡排序和选择排序来加强基础。

然而刚看冒泡排序就发现了一个奇怪的问题。

正常的冒泡排序是这样的

排序原理是 相领的两个数进行比较,一轮循环就能将最大或最小的数放到结尾

for (int i = 0; i < a.length - 1; i++) {for (int j = 0; j < a.length - 1 - i; j++) {if (a[j] > a[j + 1]) {int t = a[j + 1];a[j + 1] = a[j];a[j] = t;}}}

或者是这样的

排序的原理是,第i个数与i后面的每个数进行比较,如果比他小就交换位置,所以取出在i之后的最大的数

for (int i = 0; i < b.length; i++) {for (int j = i+1; j < b.length; j++) {if (b[i] < b[j]) {int t = b[j];b[j] = b[i];b[i] = t;}}}

而我一直在用的排序是这样的

for (int i = 0; i < b.length; i++) {for (int j = 0; j < b.length; j++) {if (b[i] < b[j]) {int t = b[j];b[j] = b[i];b[i] = t;}}}


当我决定我需要加强基础所以再回过头来看这些东西的时候

我突然就发现我一直在用的排序在int j=i+1的地方我记成了j=0

问题就出现在那种排序出来的结果也是毫无问题的,只是比较次数由 i-1+i-2....1 到了 i*i 

以同一个数组来举例int[] a = { 2, 5, 6, 9, 7, 4, 3 };

第二种冒泡排序的结果是这样的:

9 2 3 4 5 6 7 
9 7 2 3 4 5 6 
9 7 6 2 3 4 5 
9 7 6 5 2 3 4 
9 7 6 5 4 2 3 
9 7 6 5 4 3 2 
9 7 6 5 4 3 2 

而我的排序是这样的:

9 2 5 6 7 4 3 
2 9 5 6 7 4 3 
2 5 9 6 7 4 3 
2 5 6 9 7 4 3 
2 5 6 7 9 4 3 
2 4 5 6 7 9 3 
2 3 4 5 6 7 9 


是在是看不出排序的规则是怎么样的,可是偏偏最终的结果却可以正确进行排序。

.....只是把冒泡排序的i=j+1改成了i=0就会导致结果与排序方式完全都不一样

而我一直在用的第二种排序的方法.....我看了半天是在是想不出来他的排序原理,排序的结果偏偏是正确的....

可能其中有我暂时还不知道的排序原理,而我记下这些也是为了告诉大家,

当初基础比较差的时候记下的排序方式,可能有人和我错在了一样的地方,

虽然最后确确实实能排序正确,但是还是一定要清楚的记住冒牌排序比较的j=i+1;而不是j=0;


关于选择排序

for (int i = 0; i < a.length-1; i++) {int min = i;for (int j = i + 1; j < a.length; j++) {if (a[min] < a[j]) {min = j;}}if (i != min) {int tmp = a[min];a[min] = a[i];a[i] = tmp;}for(int v=0;v<a.length;v++) {System.out.print(a[v]+" ");}System.out.println();}
它的实现是这样的

原理与第二种冒泡排序的差异只是第二种冒泡排序是每当找到比自己小的就交换位置

而选择排序是记下他的位置,最后再交换位置。只交换了一次,而冒泡可能交换多次


一些小优化就是比较的时候最后一次比较其实可以省略,因为前面的排序都结束了,自然而然最后一个就是最小或者最大。

over~其实感觉没什么必要写这样一篇博客,只是实在不懂i=0时候的排序原理,望大神指导的可以指点一下,感谢!


 
原创粉丝点击