排序算法之选择排序-直接选择排序与堆排序

1.直接选择排序

1.1 算法思想

1.1.1 设待排序记录放置在a[n]数组中,第一趟从a[0]开始,通过n-1次比较,从n个记录中选出关键字最小的记录,记为n[k],并交换a[0]与a[k]。

1.1.2 第二趟从a[1]开始,通过n-2次比较,从n个记录中选出关键字最小的记录,记为n[k],并交换a[1]与a[k]。

1.1.3 以此类推,经过n趟,排序完成。

1.2 算法图解

1.3 代码与结果

public class ChooseSort {

    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49};
        Csort(a);
        for(int i=0;i<a.length;i++)
        {
            System.out.println(a[i]);
        }
    }

    public static void Csort(int[] a)
    {
        for(int i=0;i<a.length;i++)
        {
            int k=i;
            for(int j=i+1;j<a.length;j++)
            {
                if(a[j]<a[k])
                {
                    k=j;
                }
            }
            if(k!=i)
            {
                int temp =a[i];
                a[i]=a[k];
                a[k]=temp;
            }
        }
    }
}

13 27 38 49 49 65 76 97 

1.4 总结

1.4.1 时间复杂度O(n2),空间复杂度O(1)

1.4.2 是稳定排序

 

2.堆排序

2.1 算法思想

建初堆,调整堆,堆排序!

2.1.1 建初堆,从最后一个不为树的叶结点开始依次调整堆,知道成为一个大根堆。

2.1.2 调整堆,假设a[s+1...m]已经是堆得情况下,将a[s...m]调整为堆,比较2s+1与2s+2的大小(数组以0开始),取较大值,与a[s]进行比较,若a[s]较大,则结束。否则,交换a[s]与a[2s+1]和a[2s+2]中的较大者,并继续进行上述操作。

2.1.3 推排序,将堆顶元素和末尾元素进行交换,并调整堆。再将堆顶元素和倒数第二个元素进行交换,并调整堆。重复上述操作至排序完成。

2.2 算法图解

 

2.3 代码与结果

public class HeapSort {

    //调整堆
    public static void adjustHeap(int[] a,int s,int m)
    {
        int temp=a[s];
        for(int j=2*s+1;j<=m;j=j*2)
        {
            if(j<m&&a[j]<a[j+1]) j++;
            if(temp>a[j]) break;
            a[s]=a[j];
            s=j;
        }
        a[s]=temp;
    }


    //建初堆
    public  static  void createHeap(int[] a)
    {
        for(int i=a.length/2;i>=0;i--)
        {
            adjustHeap(a,i,a.length-1);
        }
    }

    //堆排序

    public static void Hsort(int[] a)
    {
        createHeap(a);
        for(int i=a.length-1;i>=1;i--)
        {
            int temp=a[0];
            a[0]=a[i];
            a[i]=temp;
            adjustHeap(a,0,i-1);
        }
    }

    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49};
        Hsort(a);
        for(int i=0;i<a.length;i++)
        {
            System.out.println(a[i]+" ");
        }
    }
}
13 27 38 49 49 65 76 97 

2.4 总结

2.4.1 时间复杂度O(nlogn) 空间复杂度O(1)

2.4.2 是不稳定排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值