数据结构与算法中的七大排序(Java实现)

这篇具有很好参考价值的文章主要介绍了数据结构与算法中的七大排序(Java实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、直接插入排序

二、希尔排序

三、直接选择排序

四、堆排序

五、冒泡排序

六、快速排序

七、归并排序


一、直接插入排序

思想:

             定义i下标之前的元素全部已经有序,遍历一遍要排序的数组,把i下标前的元素全部进行排序,当遍历玩这个数组后,就已经排好序了。

代码如下:

public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i - 1;
            for(; j >= 0;; j--) {
                if(array[j] > tmp) {
                    array[j + 1] = array[j];
                } else {
                    break;
                }
            }
            array[j + 1] = tmp;
        }
    }

代码解析

                要使i下标之前的元素都有序,定义一个j下标,为i - 1;再用tmp记录i下标的位置只要j下标元素比tmp大,j下标的元素就要放到j+1下标,最后j走完后,再把最小的tmp放在j+1位置。

时间复杂度、空间复杂度、稳定性:

        时间:O(n^2)

        空间:O(1)

        稳定性:稳定


二、希尔排序

思想:

                希尔排序也称缩小增量排序,就是分次去进行排序越排到后面就会越有序每次间隔是gap,然后逐渐缩小,到最后间隔为0,也就是用我们的直接插入排序,数组越有序,速度也会越快。那么就很简单了,我们只需改一下直接插入排序每次排序的间隔,把他们分成不同组进行排序,直到最后间隔为0,就只剩一组,然后也是用直接插入排序,做最后一次排序,排完就是有序的了。

图式例:

数据结构与算法中的七大排序(Java实现),数据结构,java,排序算法

代码如下:

public static void shellSort(int[] array) {
        int gap = array.length / 2;
        while (gap >= 1) {
            gap /= 2;
            shell(array, gap);
        }
    }
    public static void shell(int[] array, int gap) {
        for (int i = gap; i < array.length; i++) {
            int tmp = array[i];
            int j = i - gap;
            for(; j >= 0; j -= gap) {
                if(array[j] > tmp) {
                    array[j + gap] = array[j];
                } else {
                    break;
                }
            }
            array[j + gap] = tmp;
        }
    }

时间复杂度、空间复杂度、稳定性:

        时间:n^1.3(严蔚敏) 因为gap取值方式不同,计算出来的时间复杂度也会不同

        空间:O(1)

        稳定性:不稳定


三、直接选择排序

思想:

                直接选择排序也是和直接插入排序差不多,定义i下标前的元素全部都有序,不过排序的方式不同,它是拿i下标前的元素和i下标后的元素进行比较找到下标最小的元素把最小元素放进i下标中,同时这个i下标元素放到被这个最小下标位置。

代码实现:

public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;//记录最小值的下标
            for (int j = i+1; j < array.length; j++) {
                if(array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            //走完这里,找到最小元素的下标minIndex
            //交换
            int tmp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = tmp;
        }
    }

时间复杂度、空间复杂度、稳定性:

        时间:O(n^2)

        空间:O(1)

        稳定性:不稳定


四、堆排序

思想:

                堆其实就是完全二叉树,下标是从上到下,从左到右依次递增,要把堆排序成升序,就要把他先变成大根堆,每次出大根堆的顶点,把顶点放在最后一个节点,然后再向下调整一次第二次把大根堆的顶点放到倒数第二个位置,依次往后推。

代码实现:

//堆排序
    public static void heapSort(int[] array) {
        //先转换成大根堆
        createHeap(array);
        //开始换,然后向下转换
        for (int i = array.length - 1; i > 0 ; i--) {
            //i下标的节点和堆顶交换
            int tmp = array[0];
            array[0] = array[i];
            array[i] = tmp;
            //向下调整
            siftDown(array,0, i);
        }
    }
//创建大根堆
    public static void createHeap(int[] array) {
        //从最后一个父节点开始向下调整,下标依次往前减
        //parent = (child - 1) / 2; 左:child = parent * 2 + 1 右:child = parent * 2 + 2
        for (int i = (array.length - 1 - 1) / 2; i >= 0 ; i--) {
            siftDown(array, i, array.length);
        }
    }
    //向下调整
    public static void siftDown(int[] array, int parent, int length) {
        //定义一个child为该父节点的左孩子
        int child = parent * 2 + 1;
        while (child < length) {
            //比较改父节点的左右孩子,把值最大的孩子作为交换节点
            if(array[child] < array[child + 1]) {
                child += 1;
            }
           //比较父节点和孩子节点大小
            if(array[parent] < array[child]) {
                //交换
                int tmp = array[parent];
                array[parent] = array[child];
                array[child] = tmp;
                parent = child;
                child = child * 2 + 1;
            } else {
                break;
            }
        }
    }
    

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(1)

        稳定性:不稳定

五、冒泡排序

思想:

                冒泡排序的思想很简单,就是第一次把最大的值放到数组最后一个下标中,再把第二大的元素放到数组倒数第二个下标中,依次类推

代码实现:

 //冒泡排序
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            boolean flag = false;//标记
            for (int j = 0; j < array.length - 1 - i; j++) {
                if(array[j] > array[j + 1]) {
                    //交换
                    int tmp =array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    flag = true;
                }
            }
            if(!flag) {
                break;
            }
        }
    }

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(N^2)

        空间复杂度:O(1)

        稳定性:稳定


六、快速排序

思想:

                使用递归思想也可以采用非递归思想把一组数据划分成两部分左边都小于该下标元素,右边都大于该下标元素,再在左边去找元素划分,右边元素去划分,依次往后推,直到左右两边都没有元素可以划分了,就是只剩一个元素了,这时候往回倒,就有序了

代码实现:

public static void quickSort(int[] array) {
        int left = 0;
        int right = array.length - 1;
        quick(array, left, right);
    }
    public static void quick(int[] array, int start, int end) {
        //递归结束条件
        if(start >= end) {
            return;
        }
        int pivot = partition(array, start, end);
        quick(array, start, pivot - 1);
        quick(array, pivot + 1, end);
    }
    public static int partition(int[] array, int left, int right) {
        //找到一个下标元素,左边都比这个下标元素小,右边都比这个下标元素大,并且还要返回这个下标
        //记录下标为0的值,放在tmp中
        int tmp = array[0];
        while (left < right) {
            //先走右边
            while(left < right && array[right] >= tmp) {
                right--;
            }
            while(left < right && array[left] <= tmp) {
                left++;
            }
            //左下标的值大于tmp,右下标的值小于tmp,这两个下标值交换
            int newTmp = array[left];
            array[left] = array[right];
            array[right] = newTmp;
        }
        //走到这,left和right相遇了,left下标的值和tmp交换,并且返回这个位置的下标
        int newTmp = tmp;
        tmp = array[left];
        array[left] = newTmp;
        return left;
    }

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(logN~N)

        稳定性:不稳定


七、归并排序

思想:

                将一组数组分割成左右两部分,和快速排序找出的中件位置不同,归并的中间位置是最左和最右下标相加再除2(left+right)/ 2,运用的也是递归思想(也可以采用非递归思想,采用分治法,一直找到最左边进行排序,然后再找最右边进行排序,再往归回整体排序(合并)合并的时候是放在一个临时数组中,再把这个临时数组拷贝到原数组,下标要对应

代码实现:

public static void mergeSort(int[] array) {
        int start = 0;
        int end = array.length - 1;
        mergeSortFunc(array, start, end);
    }
    //套壳
    public static void mergeSortFunc(int[] array, int start, int end) {
        //递归结束标志
        if(start >= end) {
            return;
        }
        //求出中间节点位置
        int mid = (start + end) / 2;
        //左边
        mergeSortFunc(array, start, mid);
        //右边
        mergeSortFunc(array, mid + 1, end);
        //合并
        merge(array, start, mid, end);
    }

    //合并
    public static void merge(int[] array, int left, int mid, int right) {
        //定义mid两边的左右下标
        int s1 = left;
        int e1 = mid;
        int s2 = mid + 1;
        int e2 = right;
        //定义一个新的数组,存放array排序完后的数组
        int[] tmpArray = new int[right - left - 1];
        int k = 0;
        while (s1 <= e1 && s2 <= e2) {
            //比较左右两边s1和s2的值
            if(array[s1] < array[s2]) {
                tmpArray[k++] = array[s1++];
            } else {
                tmpArray[k++] = array[s2]++;
            }
            if(s1 <= e1) {
                tmpArray[k++] = array[s1++];
            }
            if(s2 <= e2) {
                tmpArray[k++] = array[s2++];
            }
        }
        //拷贝到原数组
        for (int i = 0; i < tmpArray.length; i++) {
            array[left + i] = tmpArray[i];
        }
    }

时间复杂度、空间复杂度、稳定性:

        时间复杂度:O(NlogN)

        空间复杂度:O(N)

        稳定性:不稳定


都看到这了,给个免费的赞呗,谢谢谢谢!!!文章来源地址https://www.toymoban.com/news/detail-735479.html

到了这里,关于数据结构与算法中的七大排序(Java实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——七大排序[源码+动图+性能测试]

    本章代码gitee仓库:排序 我们日常打扑克牌,摸牌,让后将牌按顺序插入好,这其实就是插入排序的过程,打小插入排序的思想就植入我们的脑海 第一张牌不用管,直接拿在手里,之后的牌按照大小再一个一个插入即可 直接插入排序特性: 越接近有序,效率越高(不用那么多

    2024年02月09日
    浏览(49)
  • 【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序

    排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月09日
    浏览(67)
  • 数据结构--》掌握数据结构中的排序算法

            当我们面对海量数据时,如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分,扮演着至关重要的角色。         无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握排序算法在数据

    2024年02月08日
    浏览(43)
  • 【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】

    目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的七大排序 2.直接插入排序 2.1基本思想 2.2直接插入排序 2.3动图助解 2.4直接插入排序源码 2.5直接插入排序的特性总结 3.希尔排序( 缩小增量排序 ) 3.1希尔排序概念及思想 3.2希尔排序图解 3.3希尔排序源码 3.4希尔排序

    2024年02月13日
    浏览(53)
  • 【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

    目录 前言 1.直接选择排序 1.1基本思想 1.2直接选择排序实现过程 1.3动图助解 1.4直接选择排序源码 2.堆排序 2.1堆排序的概念 2.2堆排序源码  选择排序有两种常见的【直接选择排序】、【堆排序】 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起

    2024年02月16日
    浏览(56)
  • 【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

    目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序👑 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1🥇 情况2🥈 交换类排序两个常见的排序算法【冒泡排序】、【快速排序】 交换排序基本思想:

    2024年02月16日
    浏览(69)
  • 数据结构:手撕图解七大排序(含动图演示)

    插入排序分为直接插入排序和希尔排序,其中希尔排序是很值得学习的算法 希尔排序的基础是直接插入排序,先学习直接插入排序 直接插入排序类似于打扑克牌前的整牌的过程,假设我们现在有2 4 5 3四张牌,那么应该怎么整牌? 方法很简单,把3插到2和4中间,这样就完成了

    2024年02月15日
    浏览(51)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(56)
  • 【算法与数据结构】Java实现查找与排序

    也叫做折半查找,属于有序查找算法。 前提条件 :数组数据必须有序,从小到大,或者从大到小都是可以的。 如果是无序的,也可以先进行排序。 但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数

    2024年01月19日
    浏览(51)
  • 【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

    ✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Java数据结构与算法】 🥭本文内容:Java数据结构与算法中的比较高级的排序,希尔排序、归并排序、快速排序、计数排序

    2024年02月02日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包