排序前:70 80 31 37 10 1 48 60 33 80
[1] 80 31 37 10 70 48 60 33 80 选出最小值1
[1 10] 31 37 80 70 48 60 33 80 选出最小值10
[1 10 31] 37 80 70 48 60 33 80 选出最小值31
[1 10 31 33] 80 70 48 60 37 80 …
[1 10 31 33 37] 70 48 60 80 80 …
[1 10 31 33 37 48] 70 60 80 80 …
[1 10 31 33 37 48 60] 70 80 80 …
[1 10 31 33 37 48 60 70] 80 80 …
[1 10 31 33 37 48 60 70 80] 80 …
排序前:92 77 67 8 6 84 55 85 43 67
[77 92] 67 8 6 84 55 85 43 67 将77插入92前
[67 77 92] 8 6 84 55 85 43 67 将67插入77前
[8 67 77 92] 6 84 55 85 43 67 将8插入67前
[6 8 67 77 92] 84 55 85 43 67 将6插入8前
[6 8 67 77 84 92] 55 85 43 67 将84插入92前
[6 8 55 67 77 84 92] 85 43 67 将55插入67前
[6 8 55 67 77 84 85 92] 43 67 …
[6 8 43 55 67 77 84 85 92] 67 …
[6 8 43 55 67 67 77 84 85 92] …
排序前:95 27 90 49 80 58 6 9 18 50
27 90 49 80 58 6 9 18 50 [95] 95浮出
27 49 80 58 6 9 18 50 [90 95] 90浮出
27 49 58 6 9 18 50 [80 90 95] 80浮出
27 49 6 9 18 50 [58 80 90 95] …
27 6 9 18 49 [50 58 80 90 95] …
6 9 18 27 [49 50 58 80 90 95] …
6 9 18 [27 49 50 58 80 90 95] 由于接下来不会再发生交换动作,
排序提早结束在上面的例子当中,还加入了一个观念,就是当进行至i与i+1时没有交换的动作,表示接下来的i+2至n已经排序完毕,这也增进了气泡排序的效率。冒泡排序分为小冒泡和大冒泡,这里是大冒泡,个人认为选择排序和冒泡排序类似,选择排序是查找最小的放到数组前方,冒泡排序是选择最大的放到数组后方,小冒泡思想就和选择排序一样了。
import java.util.Arrays;
public class Select_Insort_Bub_sort {
public static void main(String[] args) {
int[] data = {70,80,31,37,10,1,48,60,33,80};
//select(data);
//insort(data);
bub(data);
System.out.println(Arrays.toString(data));
}
//选择排序
public static void select(int[] data) {
int p =0;
int p1 =0;
int min= data[p];
for(;;) {
p1 = p;//p1指针归位
//找剩余数最小值
for(int p_1=p;p_1<data.length;p_1++) {
if(data[p_1]<min) {
min = data[p_1];
p1=p_1;
}
}
//向后移动
for(int p_2=p1;p_2>p;p_2--) {
data[p_2] = data[p_2-1];
}
data[p]=min;
p++;
min = data[p];
if(p==(data.length-1))break;
}
}
//插入排序
public static void insort(int[] data) {
int x = 0;
int y;
for(int p=1;p<data.length;p++) {
for(int p1=0;p1<=x;p1++) {
if(data[p]<data[p1]) {
y = data[p];
for(int p2=p;p2>p1;p2--) {
data[p2]=data[p2-1];
}
data[p1]=y;
x++;
break;
}
}
}
}
//冒泡排序
public static void bub(int[] data) {
int end_p = data.length-1;
int max_p = end_p;
int max = data[end_p];
while(true) {
//找出最大值
for(int x=0;x<end_p;x++) {
if(data[x]>max) {
max=data[x];
max_p=x;
}
}
//移动数组
for(int x=max_p;x<end_p;x++) {
data[x]=data[x+1];
}
//最大数字移动到后边,指针和最大值初始化
{
data[end_p]=max;
end_p--;
max_p=end_p;
max= data[end_p];
}
if(end_p==0)break;
}
}
}