选择排序、希尔排序、二分查找详解

@rxq

选择排序:可以说是一种简单直观的排序算法,但是不稳定。工作原理就是,每一次从待排序的数据元素中找出最小或最大的一个元素,放在序列的起始位置,以此类推,直到全部数据元素排完。

希尔排序:又称为缩小增量排序。通过某个增量将数组元素划分为若干组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的数组元素越来越多,当增量减至1时,整个数组元素恰被分成一组,算法便终止。

二分查找:就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。该算法要求数据元素有顺序存储结构。

选择排序详细
代码展示
    /**
     * 选择排序
     */
    public static void main(String[] args) {

        //定义一个数组
        int [] arr = new int[]{3,1,5,8,12,7,4,9,11};
        String str1 = "";
        for (int i : arr) {
            str1 += i+",";
        }
        //打印数组的初始数据
        System.out.println(str1);
        //进行从小到大的排序,找最小元素
        for (int i =0 ;i < arr.length-1 ; i++){
            //记住最小元素的索引
            int minIndex = i ;
            for (int j = i ;j < arr.length ; j++){
                if(arr[j]<arr[minIndex]){
                    //比较发现比之前定义的最小索引小,将此时小的索引赋值给最小索引
                    minIndex=j;
                }
            }
            //每次循环完成,需要交换位置
            // 该操作很有可能将稳定性打破,所以选择排序是很不稳定的排序算法
            if(arr[i]!=arr[minIndex]){
                int temp = arr[i];
                //交换位置
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
        String str2 = "";
        for (int i : arr) {
            str2 += i+",";
        }
        //打印数组排序后的数据
        System.out.println(str2);
    }
测试结果展示

在这里插入图片描述

希尔排序详细
代码展示
    /**
     * 希尔排序
     */
    public static void main(String[] args) {

        //定义一个数组
        int [] arr = new int[]{3,19,5,8,12,7,66,9,11,31};
        //打印数组初始数据
        System.out.println("排序前  :   "+arrToString(arr));

        //定义初始增量
        int gap = arr.length/2;

        while(gap>=1){
            //将距离为gap的数据元素编为一个组
            for(int i = gap; i<arr.length; i++){
                int j = 0;
                int temp = arr[i];
                //对距离为gap的元素组进行排序
                for(j = i-gap ; j>=0 && temp<arr[j]; j = j-gap){
                    arr[j+gap] = arr[j];
                }
                arr[j+gap] = temp;
            }
            System.out.format("gap = %d:\t", gap);
            System.out.println(arrToString(arr));
            //每次循环后缩小增量
            gap=gap/2;
        }
        //打印数组排序后的数据
        System.out.println("排序后  :   "+arrToString(arr));
    }

    public static String arrToString(int [] arr){
        String str2 = "";
        for (int i : arr) {
            str2 += i+",";
        }
        return str2;
    }
测试结果展示

在这里插入图片描述

二分查找详细
代码展示
    /**
     * 选择排序
     */
    public static void main(String[] args) {
        //定义一个数组
        int [] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};
       //定义需要查找的元素
        int key = 13;
        System.out.println(findkey(arr,key));
        key = 6;
        System.out.println(findkey(arr,key));
        key = 9;
        System.out.println(findkey(arr,key));
    }
    public static int findkey(int[] arr,int key) {//参数1:查询操作的数组---参数2:需要查询的元素
        int start = 0;
        int end = arr.length - 1;
        int mid;
        while (start <= end) {
            mid = (end - start) / 2 + start;
            if (key < arr[mid]) {
                //如果key小于中间值,查询数组左边的元素
                end = mid - 1;
            } else if (key > arr[mid]) {
                //如果key大于中间值,查询数组右边的元素
                start = mid + 1;
            } else {
                //返回元素下标
                return mid;
            }
        }
        //如果没找到返回-1
        return -1;
    }

测试结果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值