数组之四种排序

排序的四种算法:选择排序,冒泡排序,插入排序,计数排序(前三个都是根据数据之间的大小关系进行排序,而计数排序则是根据数据本身的特性进行比较的与大小无关)

选择排序:思想就是当前元素和之后所有元素进行比较,如果当前大于后者 ,则交换

通俗来讲就是:我们以一组数列为例, 1,3,4,6,7 要用选择排序排列这组数据,先将1依次与后面元素进行比较,如果出现1比哪个元素大,就交换这两个的位置,这样第一轮就可以排列出最小的元素,第二轮开始,3与后面的元素进行比较,排列出第二个元素......一直到最后结束。

其实也就相当于第一轮 角标0  比  角标1~4

                        第二轮 角标1  比  角标2~4

                        第三轮 角标2  比  角标3~4

                        第四轮 角标3  比  角标4

class test01{
    public static void main(String[] args){
        //1.选择排序
        selectSort();
    }
    public static void selectSort(){
        int[] arr={8,5,9,2,7,4,6,1,3};
        for(int i=0;i<arr.length-1;i++){//-1是因为没有必要进行最后一个数字的比较
            for(int j=i+1;j<arr.length;j++){
                if(arr[i] >arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        show(arr);
    }
    public static void show(int[] arr){
        String s="";
        for(int i=0;i<arr.length;i++){
            if(i==arr.length-1){
                 s+=arr[i];
            }else{
                s+=arr[i]+",";
            }
        }
        System.out.println(s);
    }
}

 冒泡排序:思想就是从左到右依次进行比较,出现后者<前者,将两者进行交换

我以下面这组数据为例:1 2 5 4 3

第一轮 1,2相比1<2排列不变,2,5相比2<5排列不变,5,4相比4<5交换位置此时排列成1 2 4 5 3,   5,3和3相比5<3交换位置,此时排列称为1 2 4 3 5,这样第一轮下来就可以将最大数比较出来,置于最后;

第二轮 1,2相比1<2排列不变,2,4相比2<5排列不变,4,3相比4>3交换位置此时排列成1 2 3 4  5 5,这样第一轮下来就可以将第二大数比较出来;就这样一轮一轮的比较,最后剩下角标0与角标1进行比较

一共是比了 length-1轮i的取值就为[0,leng-1),每一轮都是从角标0开始,一直到length-1-i结束

class test01{
    public static void main(String[] args){
        //2.冒泡排序
        bubbleSort();
    }
    public static void bubbleSort(){
        int[] arr={8,5,9,2,7,4,6,1,3};
        for(int i=0;i<arr.length-1;i++){//-1是少一轮比较
            for(int j=0;j<arr.length-1-i;j++){//-1是为了避免重复和角标越界
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }  
            }
        }
        show(arr);
    }
    public static void show(int[] arr){
        String s="";
        for(int i=0;i<arr.length;i++){
            if(i==arr.length-1){
                 s+=arr[i];
            }else{
                s+=arr[i]+",";
            }
        }
        System.out.println(s);
    }
}

 插入排序:思想是若当前数字左边有数字且左边数字比它大时,交换两者位置

它与前两个排序不一样的地方就在于,前两个排序都是从角标0开始比较,而插入排序则是从角标1开始比较  

每一次的比较j的位置和i一致,若i的左边有数字则j移到i前,比较两个数字的大小

class test01{
    public static void main(String[] args){
        //3.插入排序  
        insertSort();           
    }
    public static void insertSort(){
        int[] arr={8,5,9,2,7,4};
        for(int i=1;i<arr.length;i++){
            for(int j=i;j>0&&arr[j-1]>arr[j];j--){
                 int temp=arr[j-1];
                 arr[j-1]=arr[j];
                 arr[j]=temp;           
             }
        }
        show(arr);
    }
    public static void show(int[] arr){
        String s="";
        for(int i=0;i<arr.length;i++){
            if(i==arr.length-1){
                 s+=arr[i];
            }else{
                s+=arr[i]+",";
            }
        }
        System.out.println(s);
    }
}

计数排序:思想是将数字和角标进行规整----拿到数字找角标,对应角标++即可

是一个牺牲空间换时间的排序

步骤是:1.先获取最大值和最小值

              2.根据最大值和最小值 计算存储数据的大小  max-min+1

              3.计算偏移量 offset     角标=角标对应的数据-offset

class test01{
    public static void main(String[] args){     
        //4.计数排序
        countSort();
    }
    public static void countSort(){
        int[] arr={8,5,9,2,7,4,6,1,3,10,-3,-2,-10};
        int min=arr[0];
        int max=arr[0];
        for(int i=0;i<arr.length;i++){
            if(arr[i]>max){
                max=arr[i];
            }
            if(arr[i]<min){
                min=arr[i];
            }
        }
        int[] nums=new int[max-min+1];
        int offset=min;
        for(int i=0;i<arr.length;i++){
            nums[arr[i]-offset]++;
        }
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                for(int j=0;j<nums[i];j++){
                    System.out.print(i+offset+" ");
                }
            }
        }
    }
    public static void show(int[] arr){
        String s="";
        for(int i=0;i<arr.length;i++){
            if(i==arr.length-1){
                 s+=arr[i];
            }else{
                s+=arr[i]+",";
            }
        }
        System.out.println(s);
    }
}
发布了21 篇原创文章 · 获赞 0 · 访问量 357

猜你喜欢

转载自blog.csdn.net/weixin_44318477/article/details/104347529
今日推荐