今天记录一下十大排序方法中的三种最经典的排序方法逻辑和代码,分别是冒泡排序,选择排序和插入排序。
排序的逻辑是一组无序的数,想象成有一份一模一样顺序永远不变的,做外层循环,需要排序的一组数做内层循环。有一个变量用作缓存完成交换。
1.冒泡排序
逻辑:不需要想象成两组数比较,相邻的两个数两两比较,每次都交换,要降序就把较大的数换到下标小的位置,要升序就把较小的数换到下标小的位置。总结:从前向后往前交换,两两交换,每次把大的往前换就是降序,把小的往前换就是升序
以升序为例:
for(int i=0;i<a.length;i++){
int temp;
for(int j=0;j<a.length-i-1;j++){
if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}
}
}
2.选择排序
逻辑:外圈从首位往后依次选择,内圈从外圈起始+1开始往后比较,因为自己不用和自己比,以及,前面比过的不可以重复再比,否则第一个数永远最大或最小,需要降序就遇到比自己大的,就标记下来,内圈循环结束会找到最大的,然后交换,外圈再进行第二轮。需要升序就遇到小的标记。总结,从前往后选择,往前交换,从选择位置开始往后比较,遇到大数标记交换就是降序,遇到小数标记就是升序。
以降序为例:
for(int i=0;i<a.length;i++){
int tempmin=a[i];
int min=i;
for(int j=i+1;j<a.length;j++){
if(tempmin>a[j]){tempmin=a[j];min=j;}
}
a[min]=a[i];
a[i]=tempmin;
}
3.插入排序
逻辑:外圈从第二位开始往前插入内圈,第一位前面没有数所以从第二位开始,内圈从外圈选择的位置为起始,倒着向前比较。遇到比自己大的就让它往后移动,直到遇到比自己小的,就在它后方插入。总结,从第二位开始往前比较,往后插入,遇到比自己大的数就往后移动腾出插入位置,遇到比自己小的就在这个数的后方插入,如果一直遇到比自己小的,说明这个数是最小的数,那就放入首位,这时候已经把首位位置腾出来了,如果是第一轮,相当于把a[i]与a[0]交换。
升序为例:
for(int i=1;i<a.length;i++){
int temp=a[i];
for(int j=i-1;j>=0;j--){
if(temp<a[j]){a[j+1]=a[j];}
else{a[j+1]=temp;break;}
if(j==0){a[0]=temp;}
}
}