排序原理

冒泡排序

 

冒泡排序

  • 核心思想
依次拿相邻运算作比较
  • 图解
    image

  • 使用java打印出比较过程

int[] arr={1,4,8,9,0,2};
//打印效果
/*
            arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3] arr[3]-arr[4] arr[4]-arr[5]
            arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3] arr[3]-arr[4]
            arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3]
            arr[0]-arr[1] arr[1]-arr[2]
            arr[0]-arr[1]
        */
//二维图形:两层for循环
//外层for循环控制行数  内层for循环控制本行的列数
//分析:每次比较的两个元素:前一个元素如果是arr[i] 后一个元素就是arr[i+1]
for(int  i=0;i<arr.length-1;i++){//共arr.length-1行
    for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
        //打印
        System.out.print("arr["+j+"]-arr["+(j+1)+"]\t");
    }
    System.out.println();
}
  • 把打印更改为比较即可
int[] arr={1,4,8,9,0,2};
//打印当前数组
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//把打印更改为比较即可
for(int  i=0;i<arr.length-1;i++){//共arr.length-1行
    for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
        if(arr[j]<arr[j+1]){
            int k=arr[j];arr[j]=arr[j+1];arr[j+1]=k;
        }
    }
}
//打印当前数组
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}

选择排序

 

顺序排序

  • 概念
顺序排序:依次拿当前元素何其后面的所有元素做比较
  • 图解

image

  • 使用代码模拟打印的效果
int[] arr={9,1,3,6,8,2};//要求从小到大排序
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//打印的效果
/*
        * arr[0]-arr[1] arr[0]-arr[2] arr[0]-arr[3] arr[0]-arr[4] arr[0]-arr[5]
        * arr[1]-arr[2] arr[1]-arr[3] arr[1]-arr[4] arr[1]-arr[5]
        * arr[2]-arr[3] arr[2]-arr[4] arr[2]-arr[5]
        * arr[3]-arr[4] arr[3]-arr[5]
        * arr[4]-arr[5]
        * */
for(int i=0;i<arr.length-1;i++){//外层for循环记录当前元素的下标:
    //System.out.println("当前元素:arr["+i+"]");
    for(int j=i+1;j<arr.length;j++){
        //arr[i]是当前元素
        //arr[j]是当前元素后面的元素
        //拿arr[i]和arr[j]比较
        System.out.print("arr["+i+"]-arr["+j+"] ");
    }
    System.out.println();//打印换行
}
  • 把打印更改为比较即可

冒泡排序与顺序排序的区别

//顺序排序:依次拿当前元素何其后面的所有元素做比较
int[] arr={9,1,3,6,8,2};//要求从小到大排序
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//把打印更改为比较
for(int i=0;i<arr.length-1;i++){//外层for循环记录当前元素的下标:
    for(int j=i+1;j<arr.length;j++){
        //arr[i]是当前元素
        //arr[j]是当前元素后面的元素
        //拿arr[i]和arr[j]比较
        if(arr[i]<arr[j]){
            int k=arr[i];arr[i]=arr[j];arr[j]=k;
        }
    }
}
for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//冒泡排序
for(int  i=0;i<arr.length-1;i++){//共arr.length-1行
    for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
        if(arr[j]<arr[j+1]){
            int k=arr[j];arr[j]=arr[j+1];arr[j+1]=k;
        }
    }
}
//顺序排序
for(int  i=0;i<arr.length-1;i++){//共arr.length-1行
    for(int j=i+1;j<arr.length;j++){//arr[i]作为当前元素 arr[j]作为当前元素后面的元素
        if(arr[j]<arr[i]){
            int k=arr[j];arr[j]=arr[i];arr[i]=k;
        }
    }
}

/*
分析:
 外层for循环变量i 都是从0开始到length-2:轮数相同 都是length-1轮
 内层for循环变量j
        冒泡排序:j从0开始到length-i-2     取值:length-i-1 
        顺序排序:j从i+1开始到length-1     取值:length-i-1
  比较的元素:
        冒泡排序:arr[j]和arr[j+1]比较
        顺序排序:arr[i]和arr[j]比较
*/

插入排序

 

插入排序

插入排序

image

  • 核心
插入排序:假设前面元素是有序的:拿当前元素倒着和前面的元素做比较
  • 代码
public static void main(String[] args) {
    //插入排序:假设前面元素是有序的:拿当前元素倒着和前面的元素做比较
    int[] arr={1,4,0,4,5,6,7,9,0,1};
    print(arr);
    paiXu(arr);
    print(arr);

}
public static void paiXu(int[] array){
    for(int i=1;i<array.length;i++){
        //定义变量记录当前元素的值
        int k=array[i];
        int j;
        for(j=i-1;j>=0;j--){//倒着比较
            if(array[j]>k){
                array[j+1]=array[j];//前面的元素后移一位
            }else{
                break;//找到k的正确位置 j+1
            }
        }
        array[j+1]=k;
    }
}
public static void print(int[] arr){
    for(int i=0;i<arr.length;i++){
        System.out.print(arr[i]+(i==arr.length-1?"\n":","));
    }
}

posted @ 2021-09-06 17:45  RenVei  阅读(44)  评论(0编辑  收藏  举报