五种基础排序方法

本文深入探讨了选择排序、快速排序、归并排序、希尔排序及冒泡排序的实现原理与代码细节,通过具体实例展示每种算法的工作流程。

选择排序

以升序为例,选择排序就是每次循环中选择一个最小的元素放在开头,第二小次之,以此类推。

    public static void selectSort(int[]arr){
        for(int i = 0;i<arr.length;i++){
            for(int j = i+1;j<arr.length;j++){
                if(arr[j]<arr[i]){
                    int temp = 0;
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
    public static void main(String[] args) {
        int[]arr = {1,5,6,8,7,9,12,3};
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }

快速排序

这篇文章写的很好,可以学习一下
快速排序之所以每次要先从右往左,而不是从左往右找,是因为从右往左永远是找小的,就比如
基准数是6,中间有三个数4,3,9,现在左边指向4,右边指向9,如果每次从左开始,找大的,它会直接跳过3,指到9,与6交换,结果就错了,从右往左就不会有这些问题。

    public static void quickSort(int[]arr,int low,int high){
        if(low>=high){
            return;//递归结束条件
        }
        int i = low;
        int j = high;
        int temp = arr[i];
        while (i<j){//i<j很重要,不然就容易交错
            while(arr[j]>=temp&&i<j){
                j--;
            }
            while(arr[i]<=temp&&i<j){
                i++;
            }
            if(i<j){
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
        arr[low] = arr[i];
        arr[i] = temp;
        quickSort(arr,low,j-1);
        quickSort(arr,i+1,high);
    }
    public static void main(String[] args) {
        int[]arr = {1,5,6,8,7,9,12,3};     
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

归并排序

归并排序主要运用了分治的思想,就是先不断分割,直到这一组数分割到各自独立,再逐层归并。
在这里插入图片描述
准确全面的归并

public class 归并排序 {//可以传参时把临时数组也传过去,省的每次递归都要开辟空间
    public static void merge(int[]arr,int left,int mid,int right){//归并
        int[]temp = new int[arr.length];
        int p1 = left;
        int p2 = mid+1;
        int k = left;
        while(p1<=mid&&p2<=right){
            if(arr[p1]<=arr[p2]){
                temp[k++] = arr[p1++];
            }else{
                temp[k++] = arr[p2++];
            }
        }
        while(p1<=mid){//肯定有一个先结束,后面的依次填入就好
            temp[k++] = arr[p1++];
        }
        while(p2<=right){
            temp[k++] = arr[p2++];
        }
        for(int i =left;i<=right;i++){//复制到数组里
            arr[i] = temp[i];
        }
    }
    public static void mergeSort(int[]arr,int left,int right){//分割
        if(left>=right){
            return;
        }else {
            int mid = (left+right)/2;
            mergeSort(arr,left,mid);
            mergeSort(arr,mid+1,right);
            merge(arr,left,mid,right);
        }
    }
    public static void main(String[] args) {
        int[]arr = {12,56,7,8,9,1};
        mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}

希尔排序

希尔排序是一种优化后的直接插入排序

public class ShellSort {
        public static void shellSort(int[] arr){
            for(int gap = arr.length/2;gap>0;gap/=2) {
                for(int i = gap;i<arr.length;i+=gap) {//在当前间隔上排序
                    int temp = arr[i];//要插入的数
                    int j = 0;
                    for(j = i;j>=gap&&temp<arr[j-gap];j-=gap) {//每一次都是一次直接插入排序,注意,这里j>=gap与temp<arr[j-gap]不能互换,否则会报数组越界,放前面&&有短路,前面为假后面就不会看了
                        arr[j] = arr[j-gap];//最大的数往后移一位
                    }
                    arr[j] = temp;
                }
            }
        }
    public static void main(String[] args) {
        int[]arr = new int[]{12,45,36,0,0,55,2,1,78,9};
        shellSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

冒泡排序

稍微优化了些,设置一个flag,一次循环后判断如果没有交换过,则直接break。

    public static void bubbleSort(int[]arr){
        boolean flag = true;
        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;
                    flag = false;
                }
            }
            if(flag){
                break;
            }
        }
    }
    public static void main(String[] args) {
        int[]arr = {1,59,6,4,11};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值