交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置。

冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们,直到序列比较完。我们称它为一趟冒泡,结果将最小的元素交换到待排序序列的第一个位置。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中最小元素放到了序列的最终位置,……,这样最多n-1趟冒泡就能把所有元素排好序。

void BubbleSort(ElemType A[],int n){
for(i=;i<n-;i++){
bool flag=false; //设置标志位
for(j=n-;j>i;j--) //一趟冒泡过程
if(A[j-].key>A[j].key){ //将较小的元素向上移动
ElemType temp=A[j-].key;
A[j-].key=A[j].key;
A[j].key=temp;
flag=true; //发生了数据交换,修改标志位
}
if(flag==false) return; //如果有一趟没有发生数据交换,表示序列已经完成了排序
}
}

空间复杂度:O(1)。

时间复杂度:在最糟糕的情况下,初始序列是逆序的,时间复杂度为O(n2);在最好的情况下,初始序列是顺序的,时间复杂度为O(n)。

稳定性:当两个关键字相同,if的判断条件不成立,不会发生数据的移动,因此是稳定的。

快速排序:一种基于分治法的排序方法。每一趟快排选择序列中任一个元素作为枢轴(pivot)(通常选择第一个元素),将序列中比枢轴小的元素都移到枢轴前边,比枢轴大的元素都移到枢轴后边。其实现为:

int Partition(ElemType A[],int low,int high){      //一次快速排序,low是待排序起始下标,high是待排序末位下表
ElemType pivot=A[low]; //第一个元素作为枢轴
while(low<high){
while(low<high&&A[high]>=pivot) --high; //先从末尾往前找到第一个比枢轴小的元素
A[low]=A[high]; //用high的元素替换low的元素
while(low<high&&A[low]<=pivot) ++low; //再从开头往后找到第一个比枢轴大的元素
A[high]=A[low]; //用low的元素替换high的元素
}
A[low]=pivot; //枢轴元素放在最终的位置
return low; //返回放枢轴的最终位置
}
void QuickSort(ElemType A[],int low,int high){
if(low<high){
int pivopos=Partition(A,low,high);
QuickSort(A,low,pivopos-); //分治递归左半部分
QuickSort(A,pivopos+,high); //分治递归右半部分
}
}

时间复杂度:最好情况下O(nlogn),待排序数列越无序,算法效率越高;最坏情况下时间复杂度为O(n2),待排序序列越有序,算法效率越低。

稳定性:不稳定,存在交换关键字。

C语言排序算法学习笔记——交换类排序的更多相关文章

  1. C语言排序算法学习笔记——插入类排序

    排序就是讲原本无序的序列重新排序成有序的序列.序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序. 排序的稳定性:如果排序表中有两个元素R1,R2,其对应的 ...

  2. C语言排序算法学习笔记——选择类排序

    选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...

  3. C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

    C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...

  4. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. R语言与机器学习学习笔记

    人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...

  7. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  8. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  9. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

随机推荐

  1. c/c++ 求一个整数转换为二进制数时中‘1’的个数

    求一个正整数转换为二进制数时中‘1’的个数 分析:这道题目就是很简单的位运算,我们可以把这个整数和1进行&操作(就是二进制数中的最低位与1进行&),然后将这个整数进行右移处理,将下个位 ...

  2. MySQL-8.0.11与Navicat Premium安装教程

    1. 下载MySQL 下载地址: https:////dev.mysql.com/downloads/mysql/ 百度云 链接:https://pan.baidu.com/s/1bxAtnvChZZ ...

  3. bash内建命令

    bash内建命令 1.local命令 基本介绍 local命令是用来定义一个局部变量的,它只能定义在函数中,并且随着函数的结束而被销毁 基本语法 local  [option]  name[=valu ...

  4. 时间Date.js

    <span style="line-height: 25.2px;">/** * 日期解析,字符串转日期 * @param dateString 可以为2017-02- ...

  5. 简述linux操作系统启动流程

    Linux启动流程 POST-->BootSequence(BIOS)->Bootloader(MBR,grub)-->kernnel(ramdisk,initrd)-->ro ...

  6. SSH配置

    什么是SSH: SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH ...

  7. windows下配置下burpsuite的小方法。

    1.下载破解版burpsuite和正版burpsuite. 2.安装正版burpsuite(免费版) 3.打开安装路径 4.把破解版的burp拷贝到安装路径下 5.该路径下应该有个burpsuite_ ...

  8. Java技术之如何保证同一资源被多个线程并发访问时的完整性?

    常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问.Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持. 在Java中一共有四种方法支持同步,其中前三个是同步 ...

  9. Day 21 内存处理与正则

    一.python的垃圾回收机制 1.引用计数(垃圾回收机制的根本) 1.引用计数是用来记录值的内存地址被记录的次数的 2.每一次对值地址的引用都可以使该值的引用计数+1 3.每一次对值地址的释放都可以 ...

  10. 如何长期试用Beyond Compare 4

    打开Beyond Compare 4,发现已经过了试用期   我们可以点击立即购买,购买相关的Beyond Compare 4产品,如果你已经有密钥了,可以选择使用密钥   如果还想继续试用,则找到自 ...