排序方式(8种)详解2—选择排序

目录

1、选择排序概述

2、选择排序分类

选择排序(原始版)、选择排序(递归版)、选择排序(优化版)、选择排序(优化递归版)

3、代码展示和运行结果

选择排序(原始版)

选择排序(递归版)

选择排序(优化版)

选择排序(优化递归版)

留言:为作者一人拙见,仅参考使用,如有帮助,不甚荣幸。


1、选择排序概述

选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。

原理

1>首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2>再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置。
3>重复第二步,直到所有元素均排序完毕。

2、选择排序分类

选择排序(原始版)、选择排序(递归版)、选择排序(优化版)、选择排序(优化递归版)

3、代码展示和运行结果

public static void main(String[] args) {
        System.out.println("选择排序(原始版)"+"   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
        int[] sum= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
        sort(sum);
        System.out.println("选择排序(递归版)"+"   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
        int[] sum1= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
        sort1(sum1,0,sum1.length,0);
        System.out.println("选择排序(优化版)"+"   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
        int[] sum2= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
        sort2(sum2);
        System.out.println("选择排序(优化递归版)"+"   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
        int[] sum3= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
        sort3(sum3,0,sum3.length);
    }

选择排序(原始版)

代码:

public static void sort(int[]num){
        if(num.length<2||num==null)return;
        int index=0;//标记最小值处
        int count=0;//循环次数
        int count1=0;//交换次数
        for (int i = 0; i < num.length-1; i++) {
            index=i;
            for (int j = i; j <num.length ; j++) {
                count++;
                if(num[j]<num[index])index=j;//发现更小值,获取下标
            }
            if(i!=index){//交换
                count1++;
                int c=num[i];
                num[i]=num[index];
                num[index]=c;
                System.out.print("交换了"+num[i]+"和"+num[index]+"结果:");
            }
            for (int m = 0; m < num.length; m++) {
                System.out.print(num[m]+",");
            }
            System.out.println();
        }
        System.out.println("循环次数"+count+"交换次数"+count1);
    }

运行结果:

选择排序(原始版)   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了2和4结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了3和6结果:1,2,3,77,33,45,55,90,30,67,6,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了3和77结果:1,2,3,3,33,45,55,90,30,67,6,4,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和33结果:1,2,3,3,4,45,55,90,30,67,6,33,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和45结果:1,2,3,3,4,4,55,90,30,67,6,33,45,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和55结果:1,2,3,3,4,4,4,90,30,67,6,33,45,77,55,5,6,68,98,99,76,65,66,33,43,32,43,
交换了5和90结果:1,2,3,3,4,4,4,5,30,67,6,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,
交换了6和30结果:1,2,3,3,4,4,4,5,6,67,30,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,
交换了6和67结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,
1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,
交换了32和33结果:1,2,3,3,4,4,4,5,6,6,30,32,45,77,55,90,67,68,98,99,76,65,66,33,43,33,43,
交换了33和45结果:1,2,3,3,4,4,4,5,6,6,30,32,33,77,55,90,67,68,98,99,76,65,66,45,43,33,43,
交换了33和77结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,55,90,67,68,98,99,76,65,66,45,43,77,43,
交换了43和55结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,90,67,68,98,99,76,65,66,45,55,77,43,
交换了43和90结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,67,68,98,99,76,65,66,45,55,77,90,
交换了45和67结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,68,98,99,76,65,66,67,55,77,90,
交换了55和68结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,98,99,76,65,66,67,68,77,90,
交换了65和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,99,76,98,66,67,68,77,90,
交换了66和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,76,98,99,67,68,77,90,
交换了67和76结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,98,99,76,68,77,90,
交换了68和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,99,76,98,77,90,
交换了76和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,99,98,77,90,
交换了77和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,98,99,90,
交换了90和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,99,98,
交换了98和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,
循环次数377交换次数25

选择排序(递归版)

代码:

public static void sort1(int[] num,int m,int length,int count){
        if(length<2)return;
        int index=m;//标记最小值
        for (int i = m; i < length+m; i++) {
            count++;
            if(num[i]<num[index])index=i;//发现更小值,获取下标
        }
        if(index!=0){//交换
            int c=num[m];
            num[m]=num[index];
            num[index]=c;
            System.out.print("交换了"+num[m]+"和"+num[index]+"结果:");

        }
        for (int n = 0; n < num.length; n++) {
            System.out.print(num[n]+",");
        }
        System.out.println("递归次数:"+m+"循环次数:"+count);
        sort1(num,m+1,--length,count);


    }

运行结果:

选择排序(递归版)   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:0循环次数:27
交换了2和4结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:1循环次数:53
交换了3和6结果:1,2,3,77,33,45,55,90,30,67,6,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:2循环次数:78
交换了3和77结果:1,2,3,3,33,45,55,90,30,67,6,4,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:3循环次数:102
交换了4和33结果:1,2,3,3,4,45,55,90,30,67,6,33,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:4循环次数:125
交换了4和45结果:1,2,3,3,4,4,55,90,30,67,6,33,45,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:5循环次数:147
交换了4和55结果:1,2,3,3,4,4,4,90,30,67,6,33,45,77,55,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:6循环次数:168
交换了5和90结果:1,2,3,3,4,4,4,5,30,67,6,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,递归次数:7循环次数:188
交换了6和30结果:1,2,3,3,4,4,4,5,6,67,30,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,递归次数:8循环次数:207
交换了6和67结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,递归次数:9循环次数:225
交换了30和30结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,递归次数:10循环次数:242
交换了32和33结果:1,2,3,3,4,4,4,5,6,6,30,32,45,77,55,90,67,68,98,99,76,65,66,33,43,33,43,递归次数:11循环次数:258
交换了33和45结果:1,2,3,3,4,4,4,5,6,6,30,32,33,77,55,90,67,68,98,99,76,65,66,45,43,33,43,递归次数:12循环次数:273
交换了33和77结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,55,90,67,68,98,99,76,65,66,45,43,77,43,递归次数:13循环次数:287
交换了43和55结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,90,67,68,98,99,76,65,66,45,55,77,43,递归次数:14循环次数:300
交换了43和90结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,67,68,98,99,76,65,66,45,55,77,90,递归次数:15循环次数:312
交换了45和67结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,68,98,99,76,65,66,67,55,77,90,递归次数:16循环次数:323
交换了55和68结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,98,99,76,65,66,67,68,77,90,递归次数:17循环次数:333
交换了65和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,99,76,98,66,67,68,77,90,递归次数:18循环次数:342
交换了66和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,76,98,99,67,68,77,90,递归次数:19循环次数:350
交换了67和76结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,98,99,76,68,77,90,递归次数:20循环次数:357
交换了68和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,99,76,98,77,90,递归次数:21循环次数:363
交换了76和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,99,98,77,90,递归次数:22循环次数:368
交换了77和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,98,99,90,递归次数:23循环次数:372
交换了90和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,99,98,递归次数:24循环次数:375
交换了98和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数:25循环次数:377

选择排序(优化版)

代码:

public static void sort2(int[]num){
        if(num.length<2||num==null)return;
        int left,right;//标记左右
        int min,max;//标记最大和最小值
        left=0;
        right=num.length-1;
        int m=0;
        while (left<right){
            min=left;
            max=right;

            for (int i = left; i <right+1 ; i++) {
                m++;
                if(num[i]<=num[min])min=i;//扫描获得最小值下标
                if(num[i]>=num[max])max=i;//扫描获得最大值下标
            }
            if(min!=left){
                int c=num[left];
                num[left]=num[min];
                num[min]=c;
                System.out.print("交换了"+num[left]+"和"+num[min]+"结果:");

            }
            if(max==left)min=max;
            if(max!=right){
                int c=num[right];
                num[right]=num[max];
                num[max]=c;
                System.out.print("交换了"+num[right]+"和"+num[max]+"结果:");
            }
            left++;
            right--;
            for (int n = 0; n < num.length; n++) {
                System.out.print(num[n]+",");
            }
            System.out.println("循环次数"+m);
        }

    }

运行结果:

选择排序(优化版)   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:交换了99和43结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,43,76,65,66,33,43,32,99,循环次数27
交换了2和4结果:交换了98和32结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,32,43,76,65,66,33,43,98,99,循环次数52
交换了3和6结果:交换了90和43结果:1,2,3,77,33,45,55,43,30,67,3,4,4,6,4,5,6,68,32,43,76,65,66,33,90,98,99,循环次数75
交换了3和77结果:交换了3和33结果:1,2,3,33,33,45,55,43,30,67,77,4,4,6,4,5,6,68,32,43,76,65,66,3,90,98,99,循环次数96
交换了4和33结果:交换了77和66结果:1,2,3,33,4,45,55,43,30,67,66,4,4,6,33,5,6,68,32,43,76,65,77,3,90,98,99,循环次数115
交换了4和45结果:交换了76和65结果:1,2,3,33,4,4,55,43,30,67,66,4,45,6,33,5,6,68,32,43,65,76,77,3,90,98,99,循环次数132
交换了4和55结果:交换了68和65结果:1,2,3,33,4,4,4,43,30,67,66,55,45,6,33,5,6,65,32,43,68,76,77,3,90,98,99,循环次数147
交换了5和43结果:交换了67和43结果:1,2,3,33,4,4,4,5,30,43,66,55,45,6,33,43,6,65,32,67,68,76,77,3,90,98,99,循环次数160
交换了6和30结果:交换了66和32结果:1,2,3,33,4,4,4,5,6,43,32,55,45,6,33,43,30,65,66,67,68,76,77,3,90,98,99,循环次数171
交换了6和43结果:1,2,3,33,4,4,4,5,6,6,32,55,45,43,33,43,30,65,66,67,68,76,77,3,90,98,99,循环次数180
交换了30和32结果:交换了55和32结果:1,2,3,33,4,4,4,5,6,6,30,32,45,43,33,43,55,65,66,67,68,76,77,3,90,98,99,循环次数187
交换了45和43结果:1,2,3,33,4,4,4,5,6,6,30,32,43,43,33,45,55,65,66,67,68,76,77,3,90,98,99,循环次数192
交换了33和43结果:交换了43和43结果:1,2,3,33,4,4,4,5,6,6,30,32,33,43,43,45,55,65,66,67,68,76,77,3,90,98,99,循环次数195

选择排序(优化递归版)

代码:

 public static void sort3(int[] num,int m,int length){
        if(length<2)return;
        int index=m;//左标
        int index1=num.length-m-1;//右标
        for (int i = m; i < length; i++) {
            if(num[i]<=num[index])index=i;//扫描获得最小值下标
        }
        if(index!=m){
            int c=num[m];
            num[m]=num[index];
            num[index]=c;
            System.out.print("交换了"+num[m]+"和"+num[index]+"结果:");

        }
        for (int i = m; i < length; i++) {
            if(num[i]>=num[index1])index1=i;//扫描获得最大值下标
        }
        if(index1!=(num.length-m-1)){
            int c=num[num.length-m-1];
            num[num.length-m-1]=num[index1];
            num[index1]=c;
            System.out.print("交换了"+num[num.length-m-1]+"和"+num[index1]+"结果:");

        }
        for (int n = 0; n < num.length; n++) {
            System.out.print(num[n]+",");
        }
        System.out.println("递归次数"+m);
        if(m<(num.length-m-1)) sort3(num,m+1,--length);


    }

运行结果:

选择排序(优化递归版)   数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:交换了99和43结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,43,76,65,66,33,43,32,99,递归次数0
交换了2和4结果:交换了98和32结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,32,43,76,65,66,33,43,98,99,递归次数1
交换了3和6结果:交换了90和43结果:1,2,3,77,33,45,55,43,30,67,3,4,4,6,4,5,6,68,32,43,76,65,66,33,90,98,99,递归次数2
交换了3和77结果:交换了77和33结果:1,2,3,3,33,45,55,43,30,67,33,4,4,6,4,5,6,68,32,43,76,65,66,77,90,98,99,递归次数3
交换了4和33结果:交换了76和66结果:1,2,3,3,4,45,55,43,30,67,33,4,4,6,33,5,6,68,32,43,66,65,76,77,90,98,99,递归次数4
交换了4和45结果:交换了68和65结果:1,2,3,3,4,4,55,43,30,67,33,4,45,6,33,5,6,65,32,43,66,68,76,77,90,98,99,递归次数5
交换了4和55结果:交换了67和66结果:1,2,3,3,4,4,4,43,30,66,33,55,45,6,33,5,6,65,32,43,67,68,76,77,90,98,99,递归次数6
交换了5和43结果:交换了66和43结果:1,2,3,3,4,4,4,5,30,43,33,55,45,6,33,43,6,65,32,66,67,68,76,77,90,98,99,递归次数7
交换了6和30结果:交换了65和32结果:1,2,3,3,4,4,4,5,6,43,33,55,45,6,33,43,30,32,65,66,67,68,76,77,90,98,99,递归次数8
交换了6和43结果:交换了55和32结果:1,2,3,3,4,4,4,5,6,6,33,32,45,43,33,43,30,55,65,66,67,68,76,77,90,98,99,递归次数9
交换了30和33结果:交换了45和33结果:1,2,3,3,4,4,4,5,6,6,30,32,33,43,33,43,45,55,65,66,67,68,76,77,90,98,99,递归次数10
1,2,3,3,4,4,4,5,6,6,30,32,33,43,33,43,45,55,65,66,67,68,76,77,90,98,99,递归次数11
交换了33和33结果:交换了43和33结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数12
1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数13

留言:为作者一人拙见,仅参考使用,如有帮助,不甚荣幸。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱打辅助的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值