基础复习统计之排序算法 代码 JAVA版


做个统计笔记,这里不做分析
测试用例
int a[]={5,9,8,3,1,7,2,4,6};

选择排序

选定i位置,找寻i后面的最小元素与i位置交换以此类推

   public int[] selectsort(int nums[]){
        for (int i = 0; i <nums.length ; i++) {
            //获取当前元素,看作最小值
            int min=nums[i];
            //标记下标位
            int index=i;
            for (int j = i; j <nums.length ; j++) {
                //如果比最小值小,则将该值赋值给最小值
                if (nums[j]<min){
                    min=nums[j];
                    //获取该值下标
                    index=j;
                }
            }
            //将最小值与该位置交换
            int demp=nums[i];
            nums[i]=nums[index];
            nums[index]=demp;
            System.out.println(Arrays.toString(nums));
        }
        return nums;
    }

输出:

在这里插入图片描述

冒泡排序

从头到尾比较,比他大的放该位置依次类推

 public int[] bubblesort(int nums[]){
        for(int i=0;i<nums.length-1;i++) {
            for(int j=0;j<nums.length-1-i;j++) {
                if(nums[j]>nums[j+1]) {
                    int temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
        return nums;
    }

输出:

在这里插入图片描述

插入排序

选定 i 的前元素作为已经排序好的数组 从 i 位置往前找直到找到比 nums[j]小的数,排在其后面,j 到 i-1 的位置往后移

  public int[] insertionsort(int nums[]){
        for (int i = 0; i <nums.length ; i++) {
            for (int j = i; j >0 ; j--) {
                if (nums[j]<nums[j-1]){
                    int demp=nums[j-1];
                    nums[j-1]=nums[j];
                    nums[j]=demp;
                }
            }
            System.out.println(Arrays.toString(nums));
        }
        return nums;
    }

输出:
在这里插入图片描述

快速排序

采用分治的思想,将最左的值作为基准数,先从右边找比基准数小的停止,再从左边找比他大的停止,交换这两个值,直到 i=j ,然后将这个值与基准数交换,再从这个值开始分成两个数组再进行一次同样步骤,直到左边下标大于右边下标,也就代表只有一个数的时候,这里为什么不是用等于呢,是因为i=j了,下一次递归是i+1->rigth,或者left->i-1

//快速排序
    public void quersort(int []nums,int left,int rigth){
        if (left>rigth)return;
        int i=left;
        int j=rigth;
        int index=nums[left];
        while (i!=j){
            while (i<j&&nums[j]>=index){
                j--;
            }
            while (i<j&&nums[i]<=index){
                i++;
            }
            int temp=nums[i];
            nums[i]=nums[j];
            nums[j]=temp;
        }
        nums[left]=nums[i];
        nums[i]=index;
        quersort(nums,i+1 ,rigth);
        quersort(nums,left,i-1);
    }

输出:
在这里插入图片描述

堆排序

堆排序是根据二叉树思想,由大顶堆(所有父节点大于子节点,左子节点大于右子节点)划数组。第一步是先建立大顶堆,再将root结点赋值给数组最后一位,再将数组长度减一,父节点下标可表示为i , 左子节点下标为i2+1
右子节点下标为i
2+2,父结点相对左,右子节点下标为(i-1)/2,根节点坐标为n/2-1

   public void heapify(int nums[],int n,int i){
        int root=i;
        int left=i*2+1;
        int rigth=i*2+2;
        if (left<n&&nums[left]>nums[root]){
            root=left;
        }
        if (rigth<n&&nums[rigth]>nums[root]){
            root=rigth;
        }
        if (root!=i){
            int demp=nums[i];
            nums[i]=nums[root];
            nums[root]=demp;
            heapify(nums,n,root);
        }
    }

    //堆排序
    public void hepa(int nums[],int n){
        //建堆
        for (int i =n/2-1 ; i >=0 ; i--) {
            heapify(nums,n,i);
        }
        //排序
        for (int i = n-1; i >=0 ; i--) {
            int demp=nums[i];
            nums[i]=nums[0];
            nums[0]=demp;
            heapify(nums,i,0);
        }
    }

输出:
在这里插入图片描述

归并排序

讲究先分再合,分到只有一个元素时开始比较并合并,小的就放在前面大的放在后面,一步一步倒着合并。

  //合并
    public void merge(int nums[],int demparr[],int left,int mid,int rigth){

        //左半区第一元素
        int l=left;
        //右半区第一个元素
        int r=mid+1;
        //数组下标,从nums[0]->nums[nums.length-1]
        int index=left;

        //将左半部分和右半部分比较并合并
        while (l<=mid&&r<=rigth){
            if (nums[l]<nums[r]){
                demparr[index]=nums[l];
                index++;
                l++;
            }else {
                demparr[index]=nums[r];
                index++;
                r++;
            }
        }
        //合并完毕后会有剩余元素未比较,要不左半部分剩余,要不右半部份剩余,所以需要将剩余元素合并

        //如果左边的部分还没完那么就将右部分直接合并
        while(l<=mid){
            demparr[index]=nums[l];
            index++;
            l++;
        }
        //如果右边的部分还没完那么就将右部分直接合并
        while(r<=rigth){
            demparr[index]=nums[r];
            index++;
            r++;
        }
        //复制辅助数组元素入主数组
        while (left<=rigth){
            nums[left]=demparr[left];
            left++;
        }
    }
    //划分
    public void divide(int nums[],int demparr[],int left,int rigth){

        //如果说左边小于右边,说明有两个数以上,需要继续划分
        if (left<rigth){
            //获取中间项
            int mid=(left+rigth)/2;
            //左部分从left->mid
            divide(nums,demparr,left,mid);
            //右部分从mid+1->rigth
            divide(nums,demparr,mid+1,rigth);
            //分完之后再比较合并
            merge(nums,demparr,left,mid,rigth);
        }
    }
    //归并排序
    public int[] mergesort(int nums[]){
        int n=nums.length;
        int demparr[]=new int[n];
        divide(nums,demparr,0,n-1);
        return nums;
    }

输出:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值