排序算法,冒泡、直接选择排序

排序算法分类

排序
内部排序
外部排序
插入排序
直接插入排序
希尔排序
选择排序
直接选择排序
堆排序
交换排序
冒泡排序
快速排序
归并排序
桶排序

常用的排序算法都是内部排序,是指将数据加载到内部存储器中进行排序。外部排序是由于数据量过大,需要借助外部存储器进行排序。

冒泡排序

冒泡排序在排序数组元素时,将大数往后移,小数往前移,类似水泡上升。基本思想:每次比较相邻的两个数,将大的数放在后面,进行一趟排序后,会将最大的数放在数组的最后位置。对一个长度为6的数组{4,24,64,3,1,15},冒泡排序需要进行n-1=6-1=5(n为数组长度)趟排序。每进行一趟排序,内部的比较次数减少一次,因为最后一个数最大不需要进行比较。可以得出:第一趟排序:比较5次;第二趟排序:比较4次;。。。第五趟排序:比较1次。

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr= {4,24,64,3,1,15};
        bubbleSort(arr);
    }
    private static void bubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){  //外层循环控制循环趟数
            for(int j=0;j<arr.length-1-i;j++){  //内层循环控制比较次数
                if(arr[j]>arr[j+1]){
                    int temp =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        for(int i:arr){
            System.out.print(i+"\t");
        }
        System.out.println();
    }
}

对上面的标准冒泡排序算法可以进行一定的改进。
适用的情形:如当数据基本有序,{1,18,2,3,4},该数组进行第一趟排序后就可以得到有序的数组,将不需要进行后续的排序比较。
对上述的情况,可以在冒泡排序的循环内添加标识,如果在一趟排序中没有进行任何一次的数据位置交换,说明数据已经排序成功,此时直接退出排序的外循环即可。改进代码如下

import java.util.Arrays;
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr= {1,18,2,3,4};
        bubbleSort(arr);
    }
    private static void bubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            boolean flag = false;
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    flag=true;
                    int temp =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            System.out.printf("第%d趟排序",i+1);
            System.out.println(Arrays.toString(arr));
            if(!flag){
                break;
            }
        }
        /*for(int i:arr){
            System.out.print(i+"\t");
        }
        System.out.println();*/
    }
}1趟排序[1, 2, 3, 4, 18]2趟排序[1, 2, 3, 4, 18]

结果进行了两趟排序就结束,第一趟排序得到有序数组,第二趟排序比较没有元素互换位置,直接退出循环得到结果。

直接选择排序

直接选择排序与冒泡排序不同,其内循环不是比较相邻的元素进行位置交换,而是找到数组中最大(小)的元素将其放在最后(前)的位置。其交换次数要比冒泡排序少很多。
同样的,对一个长度为6的数组{4,24,64,3,1,15},也要进行n-1=5轮排序,每轮排序的比较次数也依次递减。

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int[] arr= {1,18,2,3,4};
        selectSort(arr);
    }
    private static void selectSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            int index = 0;
            for(int j=1;j<arr.length-i;j++){
                if(arr[index]<arr[j]){    //内循环找出最大值索引
                    index=j;
                }
            }
            int temp = arr[arr.length-i-1]; //进行一轮排序后找出最大值与
            arr[arr.length-i-1]=arr[index]; //最后位置元素互换 
            arr[index]=temp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值