排序算法(一) java实现

排序(一)

简介

在实际应用当中,我们经常会用到数组这个结构。而我们经常使用的是数字的数组,而他确实经常乱序。所以我们如何使得我们的数组有序呢?这就运用到我们的排序算法。

插入排序

插入排序是最简单的排序算法,他的时间复杂度是n²。

它的基本思想是保证从位置0到位置p的数字已经是已排序状态。
算法实现:

public class insertSort<AnyType extends Comparable<? super AnyType>> {
    public insertSort(AnyType[] a){
        int j;
        for (int i = 1; i <a.length ; i++) {
            AnyType temp=a[i];
            for(j=i;j>0&&temp.compareTo(a[j-1])<0;j--)
                a[j]=a[j-1];
            a[j]=temp;
        }
    }
}

堆排序

像我们之间讲堆的时候,我们建立一个堆花费n的时间,然后我们执行n次deleteMin方法,再将其进行拷贝得到N个元素。deleteMin花费的时间是logN,所以他们一组合就是N logN

二叉堆点 这里

代码实现

public ArrayList<AnyType> heapSort(){
        ArrayList<AnyType> list=new ArrayList<>();
        while (!isEmpty())
            list.add(deleteMin());
        return list;
    }

归并排序

归并排序也就是合并两个已排序的表,花费的最坏时间是N logN。看图在这里插入图片描述
我们可以把最后要合并的两个有序表使用递归实现,递归到最后发现是俩个开始比较然后顺序放置,再与下一个开始比较合并直至最后整的合并。

就像这个图,我们要实现这几个数字的归并排序,我们把他拆分为两个以中间为准,分而治之。
下一个也一样,就看左半部分5,4,22,他要开始归并也是从中间划分,左半部分5,4和右半部分22分开进行。进入5,4这个,4比5小则在暂时的表当中放置4,然后再放置5,再返回到上面,放入22.依次返回。
算法实现

public class MergeSort {
    private int[] myArray;
    private int[] tempArray;

    public MergeSort(int[] a){
        this.myArray=a;
        this.tempArray=new int[a.length];
    }

    public int[] getSort(){
        mergeSort(0,myArray.length-1);
        return myArray;}

    //递归实现归并,运用分治的思想进行
    private void mergeSort(int left,int right){
        int center=(left+right)/2;//获得中间位置
        if(left<right){
            //左边迭代归并,右边也迭代归并
            mergeSort(left,center);
            mergeSort(center+1,right);
            merge(left,center+1,right);
        }
    }

    //默认的得到两个位置是已经有顺序的
    private void merge(int leftPos,int rightPos,int rightEnd){
        int leftEnd=rightPos-1;
        int tempPos=leftPos;//设置暂时表的起始位置与左起点相同
        int number=(rightEnd+1-leftPos);//得到这次两个表的总数目
        while (leftPos<=leftEnd&&rightPos<=rightEnd)
            if(myArray[leftPos]<myArray[rightPos])
                tempArray[tempPos++]=myArray[leftPos++];
            else
                tempArray[tempPos++]=myArray[rightPos++];
        //如果一方放完了,另一方默认全部放入
        while (leftPos<=leftEnd)
            tempArray[tempPos++]=myArray[leftPos++];
        while (rightPos<=rightEnd)
            tempArray[tempPos++]=myArray[rightPos++];

        //最后从rightEnd位置开始反放number个数据
        for (int i = 0; i <number ; i++,rightEnd--)
            myArray[rightEnd]=tempArray[rightEnd];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TanGBx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值