排序算法(冒泡、希尔、插入、选择、快速、堆)

public class AllSort{
    public static void main(String[] args) {
        int[] nums = {4,6,7,3,5,7,1};
        insetSort(nums);
        for(int num: nums){
            System.out.print(num);
        }
    }

    //冒泡排序
    public static void bubbleSort(int[] nums){
        for(int i=0;i<nums.length-1;i++){
            for(int j=0;j<nums.length-i-1;j++){
                if(nums[j]>nums[j+1]){
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
    }

    //插入排序
    public static void insetSort(int[] nums){
        for(int i=1;i<nums.length;i++){
            int j = i;
            while(j>0){
                if(nums[j]<nums[j-1]){
                    swap(nums, j-1, j);
                }
                j--;
            }
        }
    }

    //选择排序
    public static void selectSort(int[] nums){
        for(int i=0;i<nums.length-1;i++){
            int minIndex = i;
            for(int j=i+1;j<nums.length;j++){
                if(nums[j]<nums[minIndex]){
                    minIndex = j;
                }
            }
            int temp = nums[i];
            nums[i] = nums[minIndex];
            nums[minIndex] = temp;

        }
    }

    //快速排序
    public static void quickSort(int[] nums){
        quick(nums, 0, nums.length-1);
    }
    public static void quick(int[] nums, int left, int right){
        if(left<right){
            int i = left;
            int j = right;
            int temp = nums[i];
            while(i<j){
                while(i<j && nums[j]>temp)
                    j--;
                nums[i] = nums[j];
                while(i<j && nums[i]<temp)
                    i++;
                nums[j] = nums[i];
            }
            nums[j] = temp;
            quick(nums, left, j-1);
            quick(nums, j+1, right);
        }
    }

    public static void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    //希尔排序
    public static void shellSort(int[] nums){
        for(int gap=nums.length/2;gap>0;gap/=2){
            for(int i=gap;i<nums.length;i++){
                int j = i;
                while(j-gap>=0&&nums[j]<nums[j-gap]){
                    swap(nums, j, j-gap);
                    j-=gap;
                }
            }
        }
    }

    //堆排序
    public static void heapSort(int[] nums){
        //1、构建大顶堆
        for(int i=nums.length/2-1;i>=0;i--){
            adjustHeap(nums, i, nums.length);
        }
        //2、调整堆结构+交换堆顶元素与末尾元素
        for(int j=nums.length-1;j>0;j--){
            swap(nums, 0, j);//将堆元素与末尾元素进行交换
            adjustHeap(nums, 0, j);//重新对堆进行调整
        }
    }

    public static void adjustHeap(int[] nums, int i, int length){
        int temp = nums[i];//先取出当前元素i
        for(int k=i*2+1;k<length;k=k*2+1){//从i节点的坐子节点开始,也就是2*i+1
            if(k+1<length&&nums[k]<nums[k+1]){//如果左子结点小于右子结点,k指向右子结点
                k++;
            }
            if(nums[k]>temp){
                nums[i] = nums[k];
                i = k;
            }else{
                break;
            }
        }
        nums[i] = temp;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值