八大排序算法实现及图解

八大排序算法——(万字图文详解) 本篇博客将对“直接插入排序”、“希尔排序”、“直接选择排序”、“堆排序”、“冒泡排序”、“快速排序”、“归并排序”、“计数排序”进行详细的解析(算法逻辑、具体实现过程、时间复杂度、稳定性),并附以图片帮助大家更好地理解算法逻辑以及实现每个排序的参考代码。 阅读详情

1、冒泡排序

冒泡排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

算法步骤:

1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3)针对所有的元素重复以上的步骤,除了最后一个。

4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  /**
     * @param data  要排序的数组
     */
    public static void sort(int data[]){
        for (int i=0;i<data.length;i++){
            for(int j=0;j<data.length-i-1;j++){
                if (data[j]>data[j+1]){
                    int tmp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
        for (int i:data){
            System.out.print(i+"  ");
        }
    }

2、插入排序

在这里插入图片描述
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法步骤:

1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

 public static void sort(int[] data ){
 
        for (int i =1;i<data.length;i++){
        
            int j = i ;
            int tmp = data[i];
            
            while (j > 0 && tmp < data[j - 1]){
                data[j] = data[j - 1];
                j--;
            }

            data[j] = tmp;
        }

        for(int i :data){
            System.out.println(i);
        }
    }


    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
    }

3、选择排序

在这里插入图片描述

选择排序(Selection sort)也是一种简单直观的排序算法。

算法步骤:

1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

3)重复第二步,直到所有元素均排序完毕。

 public static void sort(int[] data){
        for (int i = 0 ;i<data.length;i++){
            int tmp = data[i];
            int index = i ;
            for (int j=i+1;j<data.length;j++){
                if (tmp>data[j]){
                    tmp=data[j];
                    index = j;
                }
            }
            data[index] = data[i];
            data[i]=tmp;

        }

        for (int i:data){
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
    }

第二种实现方法

    public static void sort(int[] data){
        int len = data.length;

        for (int i = 0;i<len;i++){

            for (int j = i+1;j<len;j++){

                if (data[i]>data[j]){
                    int c = data[i];
                    data[i]=data[j];
                    data[j]=c;
                }
            }
        }

        for (int i : data){
            System.out.println(i);
        }

    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
    }

4、快速排序

在这里插入图片描述

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

public static void sort(int[] data , int left , int right){

        if (left < right) {
             //将中间的这个数和第一个数交换
            int i = left, j = right, x = data[left];
            while (i < j) {
                while(i < j && data[j] >= x) // 从右向左找第一个小于x的数
                    j--;
                if(i < j)
                    data[i++] = data[j];

                while(i < j && data[i] < x) // 从左向右找第一个大于等于x的数
                    i++;
                if(i < j)
                    data[j--] = data[i];
            }
            data[i] = x;
            sort(data, left, i - 1); // 递归调用
            sort(data, i + 1, right);
        }


    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data,0,data.length-1);
        for (int i : data){
            System.out.println(i);
        }
    }

5、归并排序

在这里插入图片描述

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

  4. 重复步骤3直到某一指针达到序列尾

  5. 将另一序列剩下的所有元素直接复制到合并序列尾

public static void sort(int[] data){

        //在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        int l = data.length;
        int[] tmp = new int[l];
        sort(data,0,l-1,tmp);

    }

    private static void sort(int[] data, int left, int right, int[] tmp) {
        if (left<right){
            int mid = (left+right)/2;

            sort(data,left,mid,tmp);           //左边归并排序,使得左子序列有序
            sort(data,mid+1,right,tmp); //右边归并排序,使得右子序列有序
            merge(data,left,mid,right,tmp);   //将两个有序子数组合并操作
        }
    }

     private static void merge(int[] data,int left,int mid,int right,int[] tmp){
        int i = left;//左序列指针
        int j = mid+1;//右序列指针
        int t = 0;//临时数组指针
        while (i<=mid && j<=right){
            if(data[i]<=data[j]){
                tmp[t++] = data[i++];
            }else {
                tmp[t++] = data[j++];
            }
        }
        while(i<=mid){//将左边剩余元素填充进temp中
            tmp[t++] = data[i++];
        }
        while(j<=right){//将右序列剩余元素填充进temp中
            tmp[t++] = data[j++];
        }
        t = 0;
        //将temp中的元素全部拷贝到原数组中
        while(left <= right){
            data[left++] = tmp[t++];
        }
    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
        System.out.println(Arrays.toString(data));
    }

6、希尔排序

在这里插入图片描述

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率

但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

算法步骤:

1)选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;

2)按增量序列个数k,对序列进行k 趟排序;

3)每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

 public static void sort(int[] data){
 
       int tmp;
       
       for (int k = data.length/2 ; k>0 ; k/=2 ){        //组大小
           for(int i =k; i<data.length; i++){            //多少组
               for (int j =i; j>=k; j-=k){               //同一组
                   if ( data[j-k] > data[j] ){           //比较大小,交换数据
                       tmp = data[j-k];
                       data[j-k] = data[j];
                       data[j] = tmp;
                   }
               }
           }
       }
    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
        System.out.println(Arrays.toString(data));
    }

7、堆排序

在这里插入图片描述
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

1)创建一个堆H[0…n-1]

2)把堆首(最大值)和堆尾互换

3)把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4) 重复步骤2,直到堆的尺寸为1

 public static void sort(int[] data){
        for(int i= data.length/2-1 ; i>=0 ; i--){
            adjustHeap(data,i,data.length);
        }

        for (int j = data.length-1; j>0;j--){
            swap(data,0,j);        //将堆顶元素与末尾元素进行交换
            adjustHeap(data,0,j);  //重新对堆进行调整
        }
    }

    /**
     * 交换元素
     * @param data
     * @param i
     * @param j
     */
    private static void swap(int[] data, int i, int j) {
        int tmp = data[i];
        data[i] = data[j];
        data[j] = tmp;
    }

    /**
     * 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)
     * @param data
     * @param i
     * @param length
     */
    private static void adjustHeap(int[] data, int i, int length) {
        int tmp = data[i];

        for (int k = i*2+1;k<length;k=k*2+1){
            if (k+1<length && data[k]<data[k+1])
                k++;
            if (data[k] > tmp){
                data[i] = data[k];
                i=k;
            }else {
                break;
            }

        }
        data[i] = tmp;
    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data);
        System.out.println(Arrays.toString(data));
    }

8、基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。点击这里了解常用的加密算法。

说基数排序之前,我们简单介绍桶排序:

算法思想:是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。

简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。

例如要对大小为[1…1000]范围内的n个整数A[1…n]排序

首先,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1…10]的整数,集合B[2]存储 (10…20]的整数,……集合B[i]存储( (i-1)10, i10]的整数,i = 1,2,…100。总共有 100个桶。

然后,对A[1…n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。 再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任 何排序法都可以。

最后,依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这 样就得到所有数字排好序的一个序列了。

假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果

对每个桶中的数字采用快速排序,那么整个算法的复杂度是

O(n + m * n/m*log(n/m)) = O(n + nlogn – nlogm)

从上式看出,当m接近n的时候,桶排序复杂度接近O(n)

当然,以上复杂度的计算是基于输入的n个数字是平均分布这个假设的。这个假设是很强的 ,实际应用中效果并没有这么好。如果所有的数字都落在同一个桶中,那就退化成一般的排序了。

前面说的几大排序算法 ,大部分时间复杂度都是O(n2),也有部分排序算法时间复杂度是O(nlogn)。而桶式排序却能实现O(n)的时间复杂度。但桶排序的缺点是:

1)首先是空间复杂度比较高,需要的额外开销大。排序有两个数组的空间开销,一个存放待排序数组,一个就是所谓的桶,比如待排序值是从0到m-1,那就需要m个桶,这个桶数组就要至少m个空间。

2)其次待排序的元素都要在一定的范围内等等。

 public static int digit(int data,int m,int r){
        /*获取data的第m位数字,该数字为r进制*/
        int i,d;
        if(m==0) return data%r;
        d=r;
        for(i=1;i<m;i++){
            d=d*r;
        }
        return (data/d)%r;
    }

    public static void sort(int array[],int n,int m,int r){
        /*数组array中存放关键字为m位的r进制数,数组大小为n*/
        int i,j,k;
        Queue[] que=new Queue[r];  //定义一个队列数组
        for( i=0;i<r;i++){    //初始化队列数组
            que[i]=new LinkedList<Integer>();
        }

        for(i=0;i<m;i++){ //进行m趟排序

            for(j=0;j<n;j++){
                k=digit(array[j], i, r);   //取出数组中第j个数的第i位的值
                que[k].add(array[j]);      //把数组中第j个数放入k对应的队列中
            }

            j=0;
            for(k=0;k<r;k++){    //把所有队列中的值取出,重新存入数组array中
                while(!que[k].isEmpty()){
                    array[j++]=(int) que[k].remove();
                }
            }

            for(j=0;j<n;j++){   //输出每趟排序的结果
                System.out.print(array[j]+", ");
            }
            System.out.println();
        }

    }

    public static void main(String[] args) {
        int[] data = {10,5,1,9,2,0,18,4};
        sort(data, data.length, 3, 10);
        System.out.println(Arrays.toString(data));
    }

总结

各种排序的稳定性,时间复杂度、空间复杂度、稳定性总结如下图:
在这里插入图片描述

关于时间复杂度:

(1)平方阶(O(n2))排序
各类简单排序:直接插入、直接选择和冒泡排序;

(2)线性对数阶(O(nlog2n))排序
快速排序、堆排序和归并排序;

(3)O(n1+§))排序,§是介于0和1之间的常数。
希尔排序

(4)线性阶(O(n))排序
基数排序,此外还有桶、箱排序。

关于稳定性:

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

十大经典排序算法 十大经典排序算法 根据算法的时间空间复杂度列出以下10种排序算法,其中蓝色底的为稳定排序,绿色底的为不稳定排序。 先谈一谈稳定性:稳定性简单来讲就是考虑排序后值相同的元素和排序前是否保持一致(如排序前a1和a2值相同,排序后仍是a1在前a2在后) 注:希尔排序时间复杂度在O(nlogn)~O(n2)之间 根据时间复杂度来划分成三小类排序 1.时间复杂度为O(n2) 1.1.冒泡排序(Bubble Sort) 简单的思想:数组中相邻元素两两比较[以左边大为例子,交换两者的位置];每一次. 阅读详情

相关推荐

webview腾讯x5内核离线安装

离线集成腾讯TBS浏览器服务,彻底解决官方下载限流问题,永久免费

观千剑而后识器,操千曲而后晓声。 7906

八大常用算法概念及其区别

一、算法思想 (一)递归(recursion)  直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。每个递归函数都要有非递归定义的初始值。 关键要素:边界条件、递归方程  典型案例:斐波那契、汉诺塔 (二)分治法(divide and conquer method)  将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各个子问题的解合并得到原问题的解。  典型案例:二分法、归并排序、快速排序、汉诺塔 (三)动态规划法(dy

zzzzzzzzzzxcvbnm的博客 1952

多智能体强化学习之值函数分解:VDN、QMIX、QTRAN系列优缺点分析(转载)

关于多智能体强化学习中VDN,QMIX,QTRAN三个算法再值分解方向的研究成果。三个算法呈递进关系

qq_33328642的博客 5857

八大算法详细讲解

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。          当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。    快速排序:是目前基于比较的内部排序中被认为是最好的方法,

春秋繁露 4119

告别Sourceforge安装器!手把手教你下载MinGW-w64离线包并配置环境变量(Windows 10/11)

本文详细介绍了如何在Windows 10/11系统上通过下载MinGW-w64离线包并配置环境变量,完全绕过Sourceforge安装器的问题。从选择正确的版本、解压到本地目录,到设置系统环境变量和验证编译环境,手把手指导开发者快速搭建稳定的GCC编译环境,解决常见的安装困扰。

weixin_30896825的博客 335

LTspice基础教程-009.LTspice波形测量

<<==上一篇:LTspice基础教程-008.LTspice PWL设置 >>==下一篇:LTspice基础教程-010. 首篇博客文末提供所有相关资源百度网盘分享链接

gaoyong_wang的博客 4万+

(一)八大算法思想

八大算法 八大算法:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。 一、枚举算法思想(暴力算法)   将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现。   经典运用:百钱买百鸡、填写运算符 二、递推算法思想   1.顺推法:从已知条件出发,逐步推算出要解决问题的方法。   2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的...

weixin_34187822的博客 960

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

八大排序算法的原理图解及代码实现

八大排序算法 程序 = 数据结构 + 算法。 设计优良程序的两个要点:选用正确的存储结构、采用合理的解决方案。 算法就是“解决方案”。而排序,是一种非常常见的业务场景,如:“前100名下单的打八折”、“成绩前三的获一等奖”、“绩效最差的扣工资”等等。但排序的实现有很多不同的解决方案,不同的解决方案需要的运算时间和存储空间不同。 这里说的八大排序算法,都是内部排序(不需要额外的空间存储数据,所有运算...

UtopiaOfArtoria的博客 2795

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 779

基于RK3588的YOLOv11目标检测NPU加速系统设计与实现——模型转换(RKNN)、量化与板端部署全流程(含环境搭建与疑难解析)

而RK3588芯片则是一款性能强劲的边缘计算芯片,将YOLOv11部署在RK3588上,可实现本地化的智能检测应用,比如工业质检中的产品缺陷识别、安防领域的异常行为监测等。比如,优化模型的推理速度,可通过调整模型的输入尺寸、使用更高效的推理框架等方式实现;可以使用RK提供的量化工具来完成这一过程,按照工具的使用说明,对ONNX模型进行量化,生成适用于RK3588的模型文件。现在,你已经掌握了从环境搭建到模型部署的全流程,赶快动手实践,让YOLOv11在RK3588上绽放智能光彩,打造属于你的AI应用吧!

m0_71589036的博客 44

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

八大排序算法 C语言过程动图详解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

艾小方的博客 7626

【ArcGIS微课1000例】0149:Geographic Imager6.6下载安装教程

首先保证电脑上安装对应版本的PS软件,笔者安装的是PS2023(V24.7)版本,然后安装本软件。保持以上窗口运行状态,然后打开PS,自动弹出如下窗口。勾选【Automatically checkout LIcense】,点击Close。双击setup开始安装,点击【确认】,一路默认安装到底。驱动器:DVD-ROM驱动器(用于DVD版本)处理器:2GHz或更快的英特尔或AMD处理器。安装完成后,将Crack中的所有文件拷贝到。硬盘:600 MB的可用硬盘空间用于安装。内存:4GB内存(建议8GB或更高)。

智慧空间实验室 1217

八大排序算法 java实现

java 八大排序算法

chx0501的专栏 526

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

手撕八大排序算法(解析源码+图解)

本文介绍了校招中重点的八大排序,到这里初阶数据结构就结束了,接下来带来c++和Linux的内容,感谢大家的点赞支持!

铭哥不写bug的博客 679

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

面试必备--八大排序算法

文章目录冒泡排序(BubbleSort)算法思路算法图解冒泡代码:直接插入排序(InsertSort)算法思路算法图解直插代码:归并排序(MergeSort)算法思路算法图解归并代码:快速排序(QuickSort)算法思路算法图解快排代码:希尔排序(ShellSort)算法思路算法图解希尔代码:堆排序(HeapSort)算法思路算法图解堆代码:基数排序(RadixSort)算法思路算法图解基数代码......

LeoByte的编程驿站 2724

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java八大排序算法

八大排序之冒泡排序 冒泡排序原理:相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 冒泡排序图解: package 八大排序; import java.util.Arrays; public class 冒泡排序 { public static void main(String[] args) { //冒泡排序的原理:相邻

Listen·Rain的博客 227

八大排序算法,快排的三种递归非递归实现,归并的递归非递归实现,排序算法复杂度及稳定性分析【有图解】

3、在走的过程中,若R遇到小于key的数,则将该数抛入坑位,并在此处形成一个坑位,这时L再向后走,若遇到大于key的数,则将其抛入坑位,又形成一个坑位,如此循环下去,直到最终L和R相遇,这时将key抛入坑位即可。3、在走的过程中,若R遇到小于key的数,则停下,L开始走,直到L遇到一个大于key的数时,将L和R的内容交换,R再次开始走,如此进行下去,直到L和R最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)三数取中,当中的三数指的是:最左边的数、最右边的数以及中间位置的数。

weixin_74461263的博客 954

数据结构 —— 八大排序(超详细图解 & 函数实现)

排序算法主要分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、计数排序等。本文将针对上述八大排序算法进行图解剖析。

十里坡小白的博客 2887

Java数组与排序,基本使用及代码实现

Java数组与排序查找元素索引位置基本查找二分查找八大排序方法冒泡排序选择排序直接插入排序希尔排序快速排序归并排序基数排序堆排序 查找元素索引位置 基本查找 根据数组元素找出该元素第一次在数组中出现的索引 public class TestArray1 { public static void main(String[] args) { //定义一个数组 int[] arr={10,20,70,10,90,100,1,2}; //根据元素查找出该元素

Unravel_TAT的博客 848

排序算法总结---C语言

排序算法总结---建议收藏排序算法概述一:冒泡排序(Bubble Sort) 1、冒泡排序简要概述 2、冒泡排序图解 3、代码实现二:选择排序(Select Sort) 1、选择排序简要概述 2、选择排序图解 3、代码实现三:插入排序(Insert Sort) 1、插入排序简要概述 2、插入排序图解 3、代码实现四:希尔排序(Shell Sort) 1、简单插入排序存在的问题 2、希尔排序简要概述 3、希尔排序图解五:快速排序(Quick Sort) 1、快速排序简要概述 2、快速排序图解 3、代码实现六:

IT优快云_的博客 1509

你真的了解排序算法吗?

💖💖 大家好呀,欢迎来看我的文章😍,不求别的,希望各位大哥哥,小姐姐们能够给我一点点支持,让我这个萌新有前进的动力,太感谢啦,爱你们😙,哈哈哈💖 八大排序算法总结一. 前言二. 如何评价一个算法的好坏2.1 时间负复杂度2.2 空间复杂度2.3 正确性2.4 可读性2.5 健壮性2.6 八大排序算法的比较三. 排序的基本概念3.1 内部排序和外部排序3.2 什么是稳定排序四. 八大排序算法详解4.1 冒泡排序4.2 插入排序4.3 选择排序4.4 希尔排序4.5 快速排序4.6 基数排序4.7 堆排序.

若离风技术博客 545

算法-八大排序

算法-八大排序 冒泡排序(Bubble Sort) 原理 冒泡排序是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的数组,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续

weixin_44048746的博客 217

算法 经典的八大排序算法详解和代码实现

算法 经典的八大排序算法详解和代码实现排序算法的介绍排序的分类算法的时间复杂度时间频度示例图表理解时间复杂度的特点时间复杂度常见的时间复杂度空间复杂度排序算法的时间复杂度冒泡排序基本思想图解代码示例结果展示代码优化结果展示选择排序基本思想图解代码实现结果展示插入排序基本思想图解代码实现结果展示希尔排序基本思想图解代码实现结果展示快速排序基本思想图解代码实现结果展示归并排序基本思想图解代码实现结果展示基数排序基本思想图解代码实现 排序算法的介绍 排序也称排序算法,排序时将一组数据,依指定的顺序进行排列的过程

菜鸟心声:学的不仅是技术,更是梦想! 4542

图解八大排序算法——我见过的最详细的讲解(转)

一、分类 1.内部排序和外部排序  内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程。 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问的排序过程。 2.比较类排序和非比较排序 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性...

weixin_30652491的博客 6189

图解算法:八大排序算法

目录第一章 性能分析1.1、时间复杂度1.2、空间复杂度1.3、排序算法分类1.4、排序算法比较第二章 冒泡排序2.1、算法介绍2.2、算法演示2.3、算法实现第三章 选择排序3.1、算法介绍3.2、算法演示3.3、算法实现第四章 插入排序4.1、算法介绍4.2、算法演示4.3、算法实现第五章 希尔排序5.1、算法介绍5.2、算法演示5.3、算法实现第六章 快速排序6.1、算法介绍6.2、算法演示6.3、算法实现第七章 归并排序7.1、算法介绍7.2、算法演示7.3、算法实现第八章 基数排序8.1、算法介绍

轻松的小希 8223
上一篇: 单例模式的几种写法
下一篇: 详解垃圾回收算法、垃圾回收器、垃圾回收类型
春来桃花开
博客等级 码龄10年 21粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值