java中的选择排序和希尔排序

1.选择排序

原理:每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。

代码示例:

public class sort{
    //1.时间复杂度:无论数据是否有序,都是O(N^2) 
    //2.空间复杂度:O(1)
    //3.稳定性:不稳定 有跳跃式交换
    public static void selectSort(int[] array){
        for (int i = 0; i <array.length ; i++) {
        //j每次从i的后一个元素开始与前面元素进行比较
            for (int j = i+1; j <array.length ; j++) {
                if(array[i]>array[j]){
                    int tmp=array[i];
                    array[i]=array[j];
                    array[j]=tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
      int [] array={2,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
      selectSort(array);
      System.out.println(Arrays.toString(array));
    }
    运行结果:
    [0, 2, 4, 5, 6, 7, 8, 9, 22, 33, 34, 55, 56, 77, 89]
}

2.shell排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

(1). 希尔排序是对直接插入排序的优化。
(2).当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
下面是分为5组的情况,i从第一组的第二个元素开始,j从第一个元素开始。 在这里插入图片描述
代码示例:

    //直接插入排序,gap为组数。gap的取值没有确定的范围,一般取质数比较好,且取的组数呈现递减,最后一个将所有数据看成一组进行排序。
    public static void shell(int []array,int gap){
        for (int i = gap; i <array.length ; i++) {
            int j;
            int tmp=array[i];
            for (j = i-gap; j >=0 ; j=j-gap) {
                if(array[j]>tmp){
                    array[j+gap]=array[j];
                } else{
                    //前面已经有序了
                    break;
                }
            }
            array[j+gap]=tmp;
        }
    }
    //1.时间复杂度:最坏情况O(N^2)最好是O(N)
    //2.空间复杂度:O(1)
    //3.稳定性:不稳定
    public static void shellSort(int []array){
        int [] drr={5,3,1};
        for (int i = 0; i <drr.length ; i++) {
             shell(array,drr[i]);
        }
    }
    public static void main(String[] args) {
      int [] array={2,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
      shellSort(array);
      System.out.println(Arrays.toString(array));
    }
    运行结果:
    [0, 2, 4, 5, 6, 7, 8, 9, 22, 33, 34, 55, 56, 77, 89]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值