1. 归并排序

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)

算法的基本思想:将每两个相邻元素进行归并,得到新的归并数组,每两个一组再次进行归并排序,直到所有元素均已排序。

C++实现:

void mergehelp(int* A,int left,int mid,int right)
    {
        int* B=new int[right-left+1];
        int index=0;
        int i=left;
        int j=mid+1;
        while(i<=mid&&j<=right)
        {
            B[index++]=A[i]<=A[j]?A[i++]:A[j++];
        }
        while(i<=mid)
        {
            B[index++]=A[i++];
        }
        while(j<=right)
        {
            B[index++]=A[j++];
        }
        for(int i=0;i<index;i++)
        {
            A[left++]=B[i];
        }
    }
    void merge(int* A,int left,int right)
    {
        if(left>=right)
            return;
        int mid=(left+right)/2;
        merge(A,left,mid);
        merge(A,mid+1,right);
        mergehelp(A,left,mid,right);
    }
    int* mergeSort(int* A, int n) {
        int left=0;
        int right=n-1;
        merge(A,0,n-1);
        return A;

}

2. 快速排序

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(logn)

算法的基本思想:

通过partition函数寻找位置点,利用递归地思想,不断对两部分数组进行划分,直到数组的个数为1。partition函数的思想,可以通过填坑法来寻找划分点pivot,将大于等于pivot值的元素放在数组右侧,将小于等于pivot值的元素放在数组左侧,返回划分点pivot的位置。

C++实现:

int partition(int* A,int left,int right)
    {
        int pivot=A[left];
        while(left<right)
        {
            while(left<right&&A[right]>=pivot)
            {
                right--;
            }
            swap(A[left],A[right]);
            while(left<right&&A[left]<=pivot)
            {
                left++;
            }
            swap(A[left],A[right]);
        }
        return left;
    }
    void quickSortHelp(int* A,int left,int right)
    {
        if(left<right)
        {
            int pivot=partition(A,left,right);
            quickSortHelp(A,left,pivot-1);
            quickSortHelp(A,pivot+1,right);
        }
    }
    int* quickSort(int* A, int n) {
        int left=0;
        int right=n-1;
        quickSortHelp(A,left,right);
        return A;

}

3. 堆排序

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  • 算法的基本思想:构造一个最大堆,堆顶的元素为最大值,将堆顶元素与数组的最后一个元素交换,则最后一个元素已排序好。不断地将堆顶元素与最后一个元素交换,直到数组的个数为一。每次交换后,都需要利用heapify函数对堆进行一次调整。构造最大堆的过程也是利用heapify函数对数组值不断进行调整。
  • C++实现:

void heapify(int* A,int left,int right)
    {
        int cur=left;
        int child=2*cur+1;
        while(child<right)
        {
            if(child+1<right&&A[child+1]>A[child])
            {
                child++;
            }
            if(A[child]>A[cur])
            {
                swap(A[cur],A[child]);
                cur=child;
                child=2*cur+1;
            }
            else
            {
                break;
            }
        }
    }
    int* heapSort(int* A, int n) {
        for(int i=n/2-1;i>=0;i--)
        {
            heapify(A,i,n-1);
        }
        for(int i=n-1;i>0;i--)
        {
            swap(A[i],A[0]);
            heapify(A,0,i);
        }
        return A;
    }

4. 希尔排序

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  • 算法的基本思想:希尔排序是插入排序的衍生版本。设置一个增量d,将数组元素分到d个增量中,在每一个增量中采用插入排序。之后缩小增量d的值,再次将元素分到d个增量中,进行插入排序。直到增量d为1,完成排序。

C++实现:int* shellSort(int* A, int n) {
        int d=n/2;
        while(d>=1)
        {
            for(int i=d;i<n;i++)
            {
                int get=A[i];
                int j=i-d;
                while(j>=0&&A[j]>=get)
                {
                    A[j+d]=A[j];
                    j=j-d;
                }
                A[j+d]=get;
            }
            d=d/2;
        }
        return A;
    }

常见排序算法整理2(C++实现)相关推荐

  1. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  2. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

  3. 常见排序算法及对应的时间复杂度和空间复杂度

    排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...

  4. 常见排序算法2–直接插入法vs希尔排序法

    常见排序算法–直接插入法vs希尔排序法 首先,我们通过一个例子来了解直接插入算法 例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序) 第一个数15无法比较,第二个数24 ...

  5. php常见排序算去,PHP兑现常见排序算法

    PHP实现常见排序算法 //插入排序(一维数组) function insert_sort($arr){ $count = count($arr); for($i=1; $i $tmp = $arr[ ...

  6. Java常见排序算法

    Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html

  7. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  8. Java 实现常见排序算法

    Java 实现常见排序算法 1. 综述 复习常见排序算法,用Java实现. 2. 代码 1 package cn.edu.tju.scs; 2 3 public class Sort { 4 publ ...

  9. 常见排序算法_解释的算法-它们是什么以及常见的排序算法

    常见排序算法 In its most basic form, an algorithm is a set of detailed step-by-step instructions to comple ...

  10. python实现常见排序算法

    python实现常见排序算法 快速排序 思想:取出第一个元素把它放到序列的中间某一个正确位置,以它进行分割成左边和右边,再分别对左边和右边进行取元素分割(递归) 递归实现 def quicksort( ...

最新文章

  1. 怎样做网络推广浅析网站被K之后,优化人员们要注意的方面是哪些?
  2. UI 设计:如何做到理性?
  3. 开源]OSharpNS 步步为营系列 - 1. 业务模块设计
  4. RabbitMQ播放模块! 构架
  5. c++函数传参:值传递、指针传递、引用传递
  6. 一个从源代码里提取中文字符串的java类
  7. 最新可用的goole翻译接口
  8. 数据结构期末复习(四)
  9. 【Tomcat】Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
  10. mybatis利用mapper代理的方法实现多条件查询
  11. Load balancer does not have available server for client:xxx
  12. springboot 使用mybatis与mybatis-generator与druid (gradle构建)
  13. Word弹窗提示“拼写或语法错误太多,无法继续显示”的处理办法
  14. Easyui 官网网址
  15. mysql mpm_zabbix+mysql mpm监控
  16. 一句话+一张图——说清楚Aprioir关联规则算法
  17. 陈艾盐:《春燕》百集访谈节目第五十九集
  18. 蓝牙耳机连接电脑无法调节音量
  19. 知心世界姐王瑞平:谷传民与大衣哥朱之文是沟通问题不是人品问题
  20. SSM_jsp实现汽车销售管理系统

热门文章

  1. 了解IHttpModule接口事件执行顺便 获取Session
  2. Home Assistant系列 -- 设置界面语言与地理位置
  3. AppLinks使用详解
  4. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  5. 基于Berkeley DB实现的持久化队列
  6. python ** 运算符_Python学习第二天--运算符小结
  7. python中0x3f_Python学习笔记(一):基本数据类型
  8. java 游戏 异步框架_基于Java的轻量级异步编程框架
  9. java定时发送_Java 定时发送邮件 | 学步园
  10. 在HTML中添加图片阴影,html – 如何在CSS中为图像添加内部阴影[复制]