1.冒泡排序
-
基本思想(按升序来说)
- 依次比较相邻两个数,将小的往前放,大的放后放,采用双层for循环,外层循环控制循环次数,负责遍历数组中每个数,内层循环负责比较。
- 外层循环完成一趟,找到这组数中的最大值,放在数组最后。
-
图解
数组a[]={112,34,57,1,90,123,23}。
外层第一次循环:
- 内层第一次循环 :34 ,112,57,1,90,123,23
- 内层第二次循环 :34,57,112,1,90,123,23
- 内层第三次循环:34,57,1,112,90,123,23
......
- 内层最后一次循环:34,57,1,90,112,23,123
外层第二次循环:
- 内层第一次循环:34,57,1,90,112,23,123
- 内层第二次循环:34,1,57,90,112,23,123
......
- 内层第最后一次循环:34,1,57,90,23,112,123
......
外层最后一次循环:
......
- 内层最后一次循环:1,23,34,57,90,112,123
package org.wetmo.demo1;
public class Demomaopao {
public static void main(String[] args) {
int[] arr ={112,34,57,1,90,123,23};
show(arr);
}
public static void show(int a[]){
for(int i=0;i<a.length-1;i++){
for(int j=1;j<a.length-i;j++) {//对于已经排好的元素,不需要再进行排序,所以是a.length-i
if(a[j-1]>=a[j]) {
int t = a[j-1];
a[j-1] = a[j];
a[j] = t;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
2.选择排序
从头到尾扫描整个数组,找出数组中最小的数与数组中的第一个元素交换,再从剩下的数中找出最小的与数组中第二个元素交换,依次进行,直到排序完成。外层循环负责遍历整个数组,以及将内层循环比较得出的最小值与数组中元素交换,内层循环负责当前数组的最小值。
以此数组为例a[]={23,12,11,56,19,100,236,67};
第一次循环结束:11,12,23,56,19,100,236,67
第二次循环结束:11,12,23,56,19,100,236,67
第三次循环结束:11,12,19,56,23,100,236,67
......
最后一次:11,12,19,23,56,67,100,236
思路:我一开始想的是,设置最小值为min=a[i],将每次循环找出的最小值赋给min,再将a[i]与min的值交换,后来发现,这种方式是错误
的,因为在最后一步,交换值的时候,虽然将最小值已经赋给了数组的第一个元素,但是却把原来数组的第一个元素弄丢了,所以后来想
了一下,用数组的下标解决了这个问题。设置最小值为min=i;循环找出最小值的下表赋给min,然后再交换好了。(这些完全是笔者个人
的理解,仅供参考)。
package org.wetmo.demo1;
public class Demoxuanze {
public static void main(String[] args) {
int[] arr={23,12,11,56,19,100,236,67,};
show(arr);
}
public static void show(int a[]){
for(int i=0;i<a.length;i++){
int min=i;
for(int j=1+i;j<a.length;j++){
if(a[min]>=a[j]){
min=j;
}
}
int t=a[i];
a[i]=a[min];
a[min]=t;
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}