关于数据结构,本人并没有进行系统的学习过,同时今天也为了加强基础并总结。
于是,重新查阅了许多资料写下这篇博文。
在对冒泡排序的研究过程中我发现了这样一个问题:
正常的冒泡排序是这样的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;
}
}
}
其排序原理是将相领的两个数进行两比较,一轮循环就能将最大或最小的数放到结尾
或者是这样的:
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;
}
}
}
其排序的原理是,第i个数与i后面的每个数进行比较,如果比他小就交换位置,所以取出在i之后的最大的数放置开头。
而我一直在用的排序是这样的
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;
}
}
}
初学java的时候基础很不扎实,导致我那时候把冒泡排序的j=i+1记成了j=0;
也同时因为我用的这个排序方法最后出来的结果也真的进行了排序,导致我也一直没发现其中的问题。
冒泡排序的结果是这样的:
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=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();
}
之前第二种冒泡排序的交换原理是当比较时发现比自己小的数就交换位置。
而选择排序是发现比自己小的数就记下他的下标,循环结束再交换位置。
冒泡排序交换了多次,选择排序交换了一次,交换的次数减少了,所以效率就会略微提高一些。
以上,即为总结的冒泡排序与选择排序。如果错误,感谢指出。