排序方法总结和实现

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

由于很多大神已经总结过各种排序算法的性能及适合坏境,这里便不再总结,只是强调几个重点。

(1)快排的空间复杂度不是o(1),是o(logn)~o(n);

(2)四种不稳定的排序算法:简单选择,快排,希尔和堆排序

(3)冒泡排序最有情况下时间复杂度可优化为o(n);

(4)归并排序的空间复杂度为o(n);

(5)快排在整体倒序的情况下时间复杂度为o(n2)

(6)建一个最大堆的复杂度为o(n):具体证明可参考算法导论相关章节

(7)本文代码的归并排序的范围是[   )

(8)本文代码的堆排序为了方便从a[1]开始

(9)在添加了语句using namespace std;语句之后,swap函数才可以使用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;

void print(int *number, int length)
{
    if(number == NULL || length < 1)
        return;

    for(int i = 0; i < length; ++i)
    {
        printf("%d ", number[i]);
    }

    printf("\n");
}

void SelectSort(int number[], int length)
{
    if(number == NULL || length < 1)
        return;

    for(int i = 0; i < length - 1; ++i)
    {
        int k = i;
        for(int j = i + 1; j < length; ++j)
        {
            if(number[k] > number[j])//注意大小于号
                k = j;
        }
        if(k != i)
        {
            swap(number[k], number[i]);
        }
    }
}

void BubbleSort(int number[], int length)
{
    if(number == NULL || length < 1)
        return;

    for(int i = 1; i < length; ++i)
    {
        for(int j = 0; j < length - i; ++j)
            if(number[j] > number[j + 1])
                swap(number[j], number[j + 1]);
    }
}

void InsertSort(int *number, int length)
{
    if(number == NULL || length < 1)
        return;

    for(int i = 1; i < length; ++i)
    {
        int tmp = number[i];
        int j;                   //在外面定义
        for(j = i - 1; j >= 0; j--)
        {
            if(number[j] > number[i])//比较的顺序别弄错了
                number[j + 1] = number[j];//最好检查一下
            else
                break;
        }
        
        number[j+1] = tmp;
    }
}

void ShellSort(int number[], int length)
{
    if(number == NULL || length < 1)
        return;

    int i, j, d;
    d = length/2;

    while(d >= 1)
    {
        for(i = d; i < length; ++i)
        {
            int tmp = number[i];
            for(j = i - d; j >= 0; j -= d)
            {
                if(number[j] > number[i])
                    number[j + d] = number[j];
                else
                    break;
            }
            number[j + d] = tmp;
        }
        d /= 2;
    }
}

int partion(int number[], int length, int start, int end)
{
    if(number == NULL || length < 1 || start < 0 || end >= length)
        return -1;

    int small = start - 1;
    for(int index = start; index < end; ++index)
    {
        
        if(number[index] < number[end])
        {   ++small;
            if(small != index)
                swap(number[small], number[index]);
        }
    }
    ++small;
    swap(number[small], number[end]);

    return small;
}
void QuickSort(int number[], int length, int start, int end)// [start, end]
{
    if(number == NULL || length < 1)
        return;

    if(start == end)
        return;

    int index = partion(number, length, start, end);
    if(index > start)
        QuickSort(number, length, start, index - 1);
    if(index < end)
        QuickSort(number, length, index + 1, end);
}

void MergeSort(int number[], int length, int start, int end, int tmp[])//[start, end)
{
    if(number == NULL || length < 1 || start < 0 || end < 1)
        return;

    //int middle = start + (end - start)/2;
    if(end - start > 1)//while(start < end)
    {
       int middle = start + (end - start)/2;
       int p = start;
       int q = middle;
       int i = start;
       MergeSort(number, length, start, middle, tmp);
       MergeSort(number, length, middle, end, tmp);

       while(p < middle || q < end)
       {
           if(q >= end || (p < middle && number[p] < number[q]))// q < end 
                tmp[i++] = number[p++];
           else
               tmp[i++] = number[q++];
       }

       for(int index = start; index < end; ++index)
           number[index] = tmp[index];
    }
}

void AjustHeap(int number1[], int i, int size)
{
    if(number1 == NULL || i < 1 || size < 1)
        return;

    int leftChild = 2 * i;
    int rightChild = 2 * i + 1;
    int max = i;

    if(i <= size/2 )// max <= size 是错的
    {
        if(leftChild <= size && number1[leftChild] > number1[max])
            max = leftChild;
        if(rightChild <= size && number1[rightChild] > number1[max])
            max = rightChild;
        if(max != i)
        {
            swap(number1[max], number1[i]);
            AjustHeap(number1, max, size);
        }

    }

}
void BuildMaxHeap(int number1[], int size)
{
    if(number1 == NULL || size < 1)
        return;

    for(int i = size/2; i >= 1; --i)
        AjustHeap(number1, i, size);
}
void HeapSort(int number1[], int size)
{
    if(number1 == NULL || size < 1)
        return;

    BuildMaxHeap(number1, size);

    for(int i = size; i >= 1; --i)
    {
        swap(number1[1], number1[i]);
        AjustHeap(number1, 1, i - 1);
    }
}
int main()
{
    int number[10] = {3, 5, 2, 10, 4, 1, 8, 7, 6, 9};
    //简单选择排序
    SelectSort(number, 10);
    print(number, 11);
    //冒泡排序
    BubbleSort(number, 10);
    print(number, 10);
    //插入排序
    InsertSort(number, 10);
    print(number, 10);
    //希尔排序
    ShellSort(number, 10);
    print(number, 10);
    //快速排序
    QuickSort(number, 10, 0, 9);
    print(number, 10);
    
    //归并排序
    int tmp[10];
    MergeSort(number, 10, 0, 10, tmp);
    print(number, 10);
    //堆排序,为了方便,堆排序从a[1]开始
    int number1[11] = {0, 3, 5, 2, 10, 4, 1, 8, 7, 6, 9};
    HeapSort(number1, 10);
    print(number1, 10);
    printf("%d\n",number1[10]);
    return 0;
}

常见的排序算法汇总(详解篇) 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中, r[i]=r[j] ,且 r[i] 在 r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。 阅读详情

相关推荐

C#——利用委托实现对某对象进行排序,要求实现冒泡排序和选择排序,以Car类型对象为例,(两种方法)

利用委托实现对某对象进行排序,要求实现冒泡排序和选择排序,以Car类型对象为例,其中Car类包括两个字段,name和price,最后在main方法中实现用冒泡排序和选择排序对Car对象的名称和价格进行排序。 第一种方法 1编写代码 using System; using System.Collections.Generic; using System.Linq; using Syste...

lmm0513的博客 561

七大经典排序算法总结【详解】

数据量规模较小,考虑插入或选择。当元素分布有序时插入将大大减少比较和移动记录的次数,如果不要求稳定性,可以使用选择,效率略高于插入;数据量规模中等,使用希尔排序;数据量规模较大,考虑堆排序(元素分布接近正序或逆序)、快速排序(元素分布随机)和归并排序(稳定性);一般来说不使用冒泡。

weixin_63189874的博客 8696

用原生Js利用sort方法 实现图片的正 倒排序和随机排序

效果如图展示:代码如下:&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;style&gt; ul,li,p{padding: 0;margin: 0;} u

this_name_true的博客 1701

c++ 不插入重复元素但也不排序_十大经典排序算法,看这篇文章就够了

微信公众号:小超说如果你觉得对你有帮助,欢迎分享如果你想系统地学习,建议在电脑端阅读我想大家学习算法之旅的开端就是各种排序算法吧,的确,排序算法广泛的应用性以及它的简洁基础等性质是初学者的不二之选,那今天我就带着你复习回顾以下各种经典的排序算法吧!希望对你有所帮助!约定:我们的排序算法操作对象为整数数组,顺序为从小到大我们首先看一下今天的内容 (抱歉,冒泡排序被挡住了?)1.冒泡排序冒泡...

weixin_39800971的博客 781

【2025CVPR】基于脉冲神经网络的能效目标检测模型:Multi-scale Spiking Detector(MSD)深度解析

本文提出了一种创新的多尺度脉冲神经网络目标检测器(MSD),通过生物启发的ONNB模块和MSDF框架实现了高效准确的目标检测。该模型采用端到端直接训练策略,在COCO数据集上达到62.0%mAP的精度,同时仅需7.8M参数和6.43mJ能耗,较传统方法提升2.8%精度并降低82.9%能耗。实验验证了其在小目标检测和事件数据处理的优越性,为边缘计算应用提供了新范式。

hasakie的博客 1109

CFD-POST中建立变量的方法

本文以测量文丘里管中全压为例阐述CFD_POST中建立变量的方式 点击进入CFD-POST界面的expressions栏中 2.与expression栏中空白处右键,new-输入新建的表达式名称 3. 在下方的空白栏中右键-varible选择需要的变量,并根据公式进行修改 4.点击进入varibles栏,空白处右击-new-输入变量名totalpressure,在下拉框中找到之前定义的totalpressure 完成后可以在varibles栏中看到新建的...

sidxi的博客 1万+

万字总结——常见的八大排序算法(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)

二万字排序总结超详解(图示 + 动图)

m0_73900674的博客 3010

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7879

数据结构排序算法(一):排序方法分类和各种排序方法的实现

一、 实验目的1. 掌握各种常用排序的算法思想;2. 掌握各种常用排序的算法实现;3. 掌握各种常用排序时间复杂度,比较各种排序的优缺点。二.排序算法的归类:总的排序算法分为以下几类:1.插入类排序:如:直接插入排序,折半插入排序,希尔排序2.交换类排序:如:冒泡排序,快速排序,其中冒泡排序应该是计算机专业的学生最为熟悉的一种排序算法了,而快速排序则是在冒泡排序的基础上一次消除多个逆序对改进而来3...

青红造了个大白之成长记 8655

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3095

Java Map 按key排序和按Value排序的实现方法

Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。 M

strggle_bin的博客 1309

系统建模语言 (SysML)

系统建模语言

追赶时代的博客 749

java map 排序_Java Map 按key排序和按Value排序的实现方法

一、理论准备Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。HashMap的值是没有顺序的,它是按照key...

weixin_31265041的博客 566

不会C# Winform用户界面设计?是因为没有掌握这些控件(建议收藏)

文章目录6.1 常用控件6.1.1 单选按钮(RadioButton)6.1.2 复选框(CheckBox)6.1.3 框架1. 面板控件Panel2. 分组框GroupBox3. TabControl控件6.1.4 应用实例6. 2 列表框和组合框6.2.1 列表框(ListBox)6.2.2 组合框(ComboBox )6.2.3 应用实例6.3 用户交互界面6.3.1 滚动条和进度条6.3.2 定时器6.3.3 菜单设计菜单设计概述MenuStrip和ContextMenuSt

智慧空间实验室 2920

分享Charles抓包 显示<unknown> 解决方案 !

首先电脑上需要安装charles,然后需要设置手机上的WiFi设置,修改配置中的代理设置,把服务器的主机名设置成你电脑当前的ip地址(需要注意的是,你的代理服务器主机名的ip地址要和你当前连的ip地址的网段需要一致)。像 Charles 这样的工具,虽然功能强大,但仍然需要用户具备一定的配置和排障能力,以应对各种复杂的网络环境。通过将 Charles 的 SSL 证书正确安装到移动设备中,并在设置中启用“允许不安全的内容”选项,最终成功解决了这一问题,并准确抓取到所有请求数据。Charles 显示。

朱雀随云记的博客 8105

python中两种实现排序的方法:冒泡排序和插入排序

在Python中直接用sort函数就可以实现对数列的排序,我们也可以不用sort函数,通过自己新建函数的方式来实现对数列的排序,自己造轮子,丰衣足食。 在这里讲一下两种排序方法:冒泡法排序冒泡法排序原理是对一个数列前后两个数进行比较,按照排序要求来确定是否交换这两个数的位置,一直进行到最后,完成排序工作。

sars231的博客 756

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

选择排序的三种方法和递归非递归实现

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 本文先介绍将要排序的数据分割成两个独立两部分的三种方法,我给它们起名为左右交换法、挖坑法、跟随交换法,其次介绍如何递归使用这些方法和非递归使用,最后介绍对快速排序优化的两种方...

航航雷的博客 911

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

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

归并排序三种实现方法(递归、非递归和自然合并排序)

1.      递归实现归并排序 1)     基本思想: 将待排元素分成大小大致相同的2个子集,分别对2个子集合进行排序,最终将排好序的子集合合并 就会得到一个排好序的集合 即为所求 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ① 分解:将当前区间一分为二,即求分裂点  ② 求解:递归地对两个子区间R[low..mid]和R[mid+1..high] 进行归并

Christine的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

js冒泡排序和快速排序实现原理和方法

面试经常遇到这个问题,所以整理下,以便理解。 经常用到的排序方法有两种,冒泡排序和快速排序。 1.先说快速排序 原理:每一次比较相邻两个数的大小,通过第一轮循环排序,找到最大值放到后面,第二轮找到二大值放后面。 代码实现: sort(arr: Array<any>) { for(let i = 0; i<arr.length;i++) { ...

kakaxiD的博客 413

java 默认排序方式_Java 实现List排序的默认方法和自定义方法

这篇文章主要介绍了Java Collections.sort()实现List排序的默认方法和自定义方法,需要的朋友可以参考下1.java提供的默认list排序方法主要代码:List list = new ArrayList();list.add("刘媛媛");list.add("王硕");list.add("李明");list.add("刘迪");list.add("刘布");//升序Collec...

weixin_34220029的博客 826

排序方法的分类和实现

1.冒泡排序 冒泡排序的原理是对临近的两个数字进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或者最小的数字就被交换到了最后一位了。然后再从头开始进行这种比较和交换,一直到完成排序。 代码如下: void BubbleSort(vector<int> &unsorted) { for (int i = 0; i < un...

aixian8156的博客 230

java实现排序的方法-继承Comparable和Comparator

1、java提供的默认List和数组排序方法       代码实现: package zmx.sort.test; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; publi

零度的博客专栏 8891

快速排序的原理及其多种方法的实现和优化

本篇详细介绍了快速排序,让使用者对快速排序有进一步认识,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。// 假设按照升序对array数组中[left, right)区间中的元素进行排序return;

Makise的博客 2667

数据结构——快速排序的三种方法和非递归实现快速排序

快速排序的三种方法hoare法,挖坑法,前后指针法,快排的优化、快速排序的非递归法

m0_64146094的博客 1144

java如何进行后端排序_web中拖拽排序和java后台交互实现方法示例

一、业务需求1,在后台的管理界面通过排序功能直接进入排序界面2,在排序界面能够人工的手动拖动需要排序的标题,完成对应的排序之后提交3,在app或者是前端就有对应的排序实现了本文将详细介绍web拖拽排序和java后台交互的相关内容,下面话不多说了,来一起看看详细的介绍吧二、页面展示将整体页面效果展示出来之后如图所示(页面点击确定之后的效果是与java后台进行交互的):三、设计思路:后台:如果需要将排...

weixin_34952098的博客 965
上一篇: 九度 1366 栈的压入弹出序列
下一篇: Nginx高级数据结构源码分析(二)-----动态数组
linuxcprimerapue
博客等级 码龄11年 0粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值