C语言排序算法总结

From: http://www.diybl.com/course/6_system/linux/Linuxjs/20091028/180420.html


排序算法一直都是让我头疼的算法。为了全面掌握排序算法,我就整理了常用的排序算法。
首先我们来了解一些基本概念:
(1)稳定排序和非稳定排序
简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就
说这种排序方法是稳定的。反之,就是非稳定的。
 比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,
则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,
a2,a3,a5就不是稳定的了。
(2)内部排序和外部排序
在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;
在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

(3)算法的时间复杂度和空间复杂度
 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。
(1)选择排序算法:它是非稳定的。每一趟在n-i+1个记录中选取最小的记录作为有序序列的第i的记录。它的算法如下:

void choose_sort(int *x, int n)/*x数组名 n为数组长度*/
{
    int i, j, min, k;
    for(i = 0; i < n-1; i++){
        min = i;
        for(j = i+1; j < n; j++){
            if(x[min] > x[j])
                min = j;
        }
        if(min != i){
            k = x[i];
            x[i] = x[min];
            x[min] = k;
        }
    }
}

(2)直接插入排序:将一个记录插入到排好序的记录中,从而得到一个新的有序表。它的算法如下:

void insert_sort(int *x, int n)
{
    int i, j, t;
    for(i = 1; i < n; i++){
        t = x[i];
        for(j = i-1; (j>=0&&t<x[j]); j--){
            x[j+1] = x[j];
        }
        x[j+1] = t;
    }
    
}

(3)快速排序:是对冒泡排序的一种改进。它首先需要一个函数Partition()将要排序的记录以low为中心分成两个部分:比x[low]下小的放low前面,比x[low]大的放low后面。假设第一趟分成了如下两部分:
x[s],x[s+1]...x[i-1]和x[i+1],x[i+1]...x[t]
可以看书,low==i.
之后我们这两部分再进行Partition()函数排序。
Partition(int *x, int low, int high)解析:
我们从high开始逆序找,从low开始顺序找,最后low等于high后便退出这一趟排序。代码如下:

int Partition(int *x, int low, int high)
{
    int key;
    key = x[low];
    while(low < high){
        while((low < high) && x[high] >= key)
            high--;
        x[low] = x[high];
        while((low < high) && x[low] <= key)
            low++;
        x[high] = x[low];
    }
    x[low] = key;
    return low;
}

递归对所有被分割的序列排序:

void QSort(int *x, int low, int high)
{
    int key_i;
    if(low < high){
        key_i = Partition(x, low, high);
        QSort(x, low, (key_i-1));
        QSort(x, (key_i+1), high);
    }
}

最后完成该函数:

void QuickSort(int *x, int n)
{
    QSort(x, 0, (n-1));
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js计算数组中每个元素出现的次数(2种方法)

js计算数组中每个元素出现的次数&#xff08;2种方法&#xff09; js动态生成唯一id Javascript生成全局唯一标识符&#xff08;GUID,UUID&#xff09;的方法

执行execute时对象名 retime_record 无效_MyBatis 的执行流程怎么可以讲的这么透彻

前言MyBatis可能很多人都一直在用&#xff0c;但是MyBatis的SQL执行流程可能并不是所有人都清楚了&#xff0c;那么既然进来了&#xff0c;通读本文你将收获如下&#xff1a;1、Mapper接口和映射文件是如何进行绑定的2、MyBatis中SQL语句的执行流程3、自定义MyBatis中的参数设置…

iOS统计项目的代码总行数

如果要统计ios开发代码&#xff0c;包括头文件的&#xff0c;CD到项目目录下&#xff0c;命令如下 ① 列出每个文件的行数 find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" |xargs wc -l ② 列出代码行数总和f…

C/C++中预编译#,##,#error作用

From: http://bluefairy218.blog.163.com/blog/static/313917532008456397524/ #是生成字符串&#xff1a; #define a(x) #x a(bc) > "bc" ##是连接&#xff1a; #define a(x) abc##x a(123) > abc123 #error是生成…

WCF安全之ASP.NET兼容模式

本文是利用ASP.NET兼容模式实现WCF安全的一个完整示例&#xff0c;其中用到了ASP.NET的Forms身份验证及Membership&#xff0c;并启用了角色管理。 由于整套安全方案完全利用ASP.NET相关功能实现&#xff0c;而未用到WCF安全策略相关的包括WCF身份验证、WCF授权及WCF传输安全等…

javase基础复习攻略《七》

容器是什么&#xff1f;通俗的讲容器指可以装其它东西的器皿&#xff0c;前面我们提到的数组便是容器的一种&#xff0c;容器的概念在JAVA中便可以理解为用来存储其它对象的器皿。本篇就让我们一起来认识一下JAVA为我们提供的容器类。 1、容器API&#xff1a; J2SDK提供的容器A…

mysql2000数据库四合一_MSSQL2000四合一

MSSQL2000四合一是包含了MS Sql Server 2000 DEVELOPER、ENTERPRISE、PERSONAL、STANDARD 四个版本。在解压目录下有 SQL2000-KB884525-SP4-x86-CHS.EXE 这是SQL 2000 的 sp4 补丁。记录安装完后一定要安装上。个人版、企业版、专业版、开发版SQL Server 2000 是 Microsoft .NE…

数据库的种类

From:http://www.job168.com/info/read_87955.html 数据库的种类 大型数据库有&#xff1a;Oracle、Sybase、DB2、SQL server 小型数据库有&#xff1a;Access、MySQL、BD2等。 2007年4月29日消息&#xff0c;国外媒体报道&#xff0c;据权威调研机构IDC初步数据显示&#x…

Visual Studio Code超级装逼编辑自带火花插件Power Mode

Visual Studio Code超级装逼编辑自带火花插件Power Mode

IE6不支持PNG图片透明效果的完美解决方案(完善版)

可怜的IE6&#xff0c;不支持PNG图片透明&#xff0c;这已经是其众多“BUG”中&#xff0c;不是那么显眼的一个&#xff0c;但也是让部分人头痛的一个了。&#xff08;今天在机房那破机器上IE6忘了抓图了&#xff0c;现在想给大家看效果也难啊。&#xff09;发个PNG大家看看。 …

更改VS的运行主窗体

Program.cs中Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());把new Form1()改成你需要启动的窗体转载于:https://www.cnblogs.com/moyuling/p/4337593.html

jms mysql_JMS学习九(ActiveMQ的消息持久化到Mysql数据库)

1、将连接Mysql数据库的jar文件&#xff0c;放到ActiveMQ的lib目录下2、修改ActiveMQ的conf目录下的active.xml文件&#xff0c;修改数据持久化的方式2.1 修改原来的kshadb的持久化数据的方式2.2 连接Mysql的配置(注意配置文件放置的位置)3、将数据持久化Mysql的运行截图3.1 …

Dynamic Performance Tables not accessible,Automatic Statistics...

From: http://igogo007.iteye.com/blog/443609 使用的PLSQL Developer 工具在对oracle 10g插入数据或查询数据的时候都会报以下错误&#xff1a;Dynamic Performance Tables not accessible, Automatic Statistics Disabled for this session. You can disable statistics…

看完这篇不要告诉我不会封装ant design弹框组件了

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 获取前端学习知识 1设计需求 封装一个弹框组件 直接调用接口 2技术栈 ant designreact 设计第一步 绘制样式 <ModalmaskClosable{false}visible{visible}title{签收协议}onOk{this.handleSignFor}onCancel…

vue+element+el-table表格简单封装成组件

vueelementel-table表格简单封装成组件

[文档].Altera - Avalon接口规范

Ch 1 导言 1.1 Avalon属性及参数 1.2 信号类型 1.3 接口时序 1.4 相关文档 Ch 2 时钟接口 2.1 时钟输入&#xff08;Sink&#xff09; 2.1.1 属性 2.1.2 信号类型 2.1.3 associatedClock接口 2.2 时钟输出&#xff08;Source&#xff09; 2.2.1 属性 2.2.2 信号类型 Ch 3 Avalo…

C++类库:OTL通用的数据库连接类库

From: http://www.cppblog.com/lovefeel2004/archive/2010/06/02/116946.aspx OTL是一个纯C的通用数据库连接模板库&#xff0c;可以支持各种当下流行的数据库&#xff0c;如Oracle&#xff0c;Sybase, MySQL, PostgreSQL, EnterpriseDB, SQLite, MS ACCESS, Firebird等等.它是…