简单排序算法

本文详细介绍了几种常见的排序算法:冒泡排序、优化后的冒泡排序、选择排序、插入排序以及希尔排序。每种算法都有清晰的代码实现,并解释了其工作原理。此外,还讲解了快速排序的基本思想和二分法查找的过程。这些算法是计算机科学的基础,对于理解数据处理和优化至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

两个for循环,两两进行比较,如果满足规则,则将两个数据进行交换

    public int[] maopao() {
        int[] arrays = {1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456};

        for (int i = arrays.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }
        return arrays;
    }

优化1

    public int[] maopao1() {
        int[] arrays = {1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456};

        for (int i = arrays.length - 1; i > 0; i--) {

            //是否发生了交换
            boolean isExchanged = false;
            for (int j = 0; j < i; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                    //发生了交换
                    isExchanged = true;
                }
            }

            //如果没有发生交换 表示已经是有序状态 没有必要继续遍历了
            if (!isExchanged) {
                break;
            }
        }

        return arrays;
    }

优化二

    public int[] maopao2() {
        int[] arrays = {1, 3, 56, 32, 33, 5, 6, 60, 61, 62, 63, 64};

        for (int i = arrays.length - 1; i > 0; i--) {

            //记录最后一次发生交换的坐标位置,该坐标之后的数据没有发生交换,代表是有序状态
            int changeIndex = 0;
            for (int j = 0; j < i; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                    //最后一次发生交换的坐标
                    changeIndex = j + 1;
                }
            }

            //下次可以从发生交换坐标的位置开始循环
            i = changeIndex;
        }

        return arrays;
    }

选择排序

不断的从数组中找出最大值,然后放入末尾

    public int[] xuanze() {
        int[] arrays = {1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456};

        for (int i = arrays.length - 1; i > 0; i--) {
            
            //记录下标
            int maxIndex = 0;
            for (int j = 0; j < i; j++) {
                if (arrays[maxIndex] < arrays[j + 1]) {
                    //记录较大值的下标,循环进行比对,找到最大值下标
                    maxIndex = j + 1;
                }
            }

            //将最大值与队尾进行交换 然后进行下一次遍历
            int temp = arrays[maxIndex];
            arrays[maxIndex] = arrays[i];
            arrays[i] = temp;

        }

        return arrays;
    }

插入排序

从数组中获取数字,并和已有的数据进行对比,选择自己插入的位置

    public int[] charu() {
        int[] arrays = {1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456};


        int current = 0;
        for (int i = 1; i < arrays.length - 1; i++) {
            //取出比较项
            current = arrays[i];
            //记录比较项前一项的下标
            int pre = i -1;
            //当前比较项数据小于前一项数据
            while (pre >= 0 && current < arrays[pre]) {
                //将前一项数据赋值给当前数据
                arrays[pre + 1] = arrays[pre];
                //下标前移 将比较项与更前边的数据进行比较
                pre--;
            }
            //当移到最前边 或者是比较项数据大于前一项数据的时候 将比较项赋值给前一项数据后边的位置
            arrays[pre + 1] =current;
        }

        return arrays;
    }

希尔排序

将序列分成一个矩阵,分为m列,逐列进行排序,m从某个整数逐渐减为1,当m为1的时候,整个序列将完全有序
希尔排序是插入排序的改进版本,是一个非稳定排序。

希尔排序介绍

快速排序

快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
再采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

二分法查找

二分法查找的思路如下:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。

(3)如果某一步数组为空,则表示找不到目标元素。

    public int binarySearch(int[] arr, int key) {
        int left = 0; //数组最小索引值
        int right = arr.length - 1; //数组最大索引值
        while (left < right) {
            int mid = (left + right) / 2;//获得中间值,将数组一分为二
            if (key == arr[mid]) {
                return mid + 1;
            } else if (key > arr[mid]) {//key大于中间值,因此在右侧的二分之一数组中再次寻找
                left = mid + 1;
            } else {//同理
                right = mid - 1;
            }
        }
        return -1;//没有找到
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值