快速上手冒号排序
原理:
1,如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
2,比较两个相邻的元素,将大的值向右移动
3,依次比较第一遍就将最大的值遍历在最后
从最简单开始,首先我们创建一个数组,该数组有5位数字:
int[] arrays= {1,9,6,5,8};
//第一次遍历
int temp;
//第一位和第二位比
if (arrays[0] > arrays[1]) {
//交换
temp = arrays[0];
arrays[0] = arrays[1];
arrays[1] = temp;
}
//第二位和第三位比
if (arrays[1] > arrays[2]) {
temp = arrays[1];
arrays[1] = arrays[2];
arrays[2] = temp;
}
//第三位和第四位比
if (arrays[2] > arrays[3]) {
temp = arrays[2];
arrays[2] = arrays[3];
arrays[3] = temp;
}
//第四位和第五位比
if (arrays[3] > arrays[4]) {
temp = arrays[3];
arrays[3] = arrays[4];
arrays[4] = temp;
}
经过我们第一组排序遍历,已经可以看出最大的值排序到最后
第二组遍历,跟第一组遍历一样,第二组也是两个相邻的元素进行比较,把大的元素向右边移动,第二组元素也把倒数第二大的排序出来了
//第一位和第二位比
if (arrays[0] > arrays[1]) {
//交换
temp = arrays[0];
arrays[0] = arrays[1];
arrays[1] = temp;
}
//第二位和第三位比
if (arrays[1] > arrays[2]) {
temp = arrays[1];
arrays[1] = arrays[2];
arrays[2] = temp;
}
//第三位和第四位比
if (arrays[2] > arrays[3]) {
temp = arrays[2];
arrays[2] = arrays[3];
arrays[3] = temp;
}
这里我的造数不够乱,比较了两次就把数据排好序了
规律:
-
可以看出第一次排序比较了四次,就把最大值排序在最后了
-
第二次排序比较了三次,由于第一次已经把最大值排序好了在最后,不用在进行比较
-
我们这里有五个数组,由此可以看出规律
-
第三次排序比较两次
-
第四次排序比较一次
由此可以得出结论,我们有五个数比较了四次,每次比较都减少了一次,由于每次排序已经把最大的值往后移,总共要进行N-1趟比较,每趟的排序次数为(N-i)次比较
因此我们可以把代码简写成这样
int[] array= {1,9,6,5,8};
//比较趟数
for (int i = 0; i < array.length-1; i++) {
//相邻的两个元素比较,大的往右边移
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]) {
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
代码优化,这里我们可以设置一个变量看看是否进行位置替换,没有进行位置替换就说明已经排序好了,不用继续遍历比较
int change;
int[] array= {1,9,6,5,8};
//比较趟数
for (int i = 0; i < array.length-1; i++) {
change=0;//记录是否发生了置换, 0 表示没有发生置换、 1 表示发生了置换
//相邻的两个元素比较,大的往右边移
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]) {
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
//到达这里说明进行位置替换
change=1;
}
}
if(change==0) {
break;
}
}
如果文章有错的地方欢迎指正,大家互相交流