C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结;
首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大)。主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序。各有各的版本,代码写法也各不相同。所以这里以整理思路为先,代码只是作为自己的一个备份。
搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定。
内部排序和外部排序,只用到内存即可完成排序的就叫内部排序,外部排序因为序列比较长,用到了外部存储。
算法好坏标准:时间复杂度和空间复杂度。分析T(n)=O(f(n))为主,这个还是比较简单的理解一下就行,因为这种方法本身也是一种统计估计。
针对3中存储结构,1、以一组连续的地址单元作为存储结构;2、以链表作为存储结构;3、和1一样存储,但是通过建立辅助表来进行排序。
插入类排序:直接插入排序,希尔排序;
第一个算法,直接插入算法,很简单,假如我们的数组是R[n+1],第一个作为交换时用的中间变量;那么R[1]作为最初的有序区,从i=2开始不断插入R[i],插入时跟有序区中的R[j]进行比较;R[0]在while循环中可以作为监视哨,以防下标变量j越界,避免了while循环检测j是否越界,测试循环条件的时间可以减少一半。
算法的时间复杂度为O(n2);排序中最坏情况就是全逆序,最好情况,全正序;根据这样的两种情况来判断。
希尔排序,多了一个增量数组,有选择规则(使得增量值没有除1之外的公因子)如5.3.1;按照增量的值进行多轮排序,使得序列趋于正序列和交换次数较少的序列;希尔排序其实就是插入排序的改进版本。
算法复杂度O(nlgn)
交换类排序:冒泡排序和快速排序
冒泡排序,想法很简单,相邻两个元素比较,大的放后面,一趟一趟比,最后完成排序。快速排序就是对这一过程进行了优化;还有双向冒泡法,改进算法,这里不深入了。冒泡排序算法复杂度O(n2)
快速排序,这里首先要选取一个基准,一般都是一上来就吧R[0]作为基准,大的放在右边,小的放在左边,形成两个子序列,然后R[0]在中间,对两个子序列继续重复上一过程,直到序列里面的个数为1;从而可以看出,这个算法可以用递归。 算法复杂度O(n2);但是他是目前基于比较的内部排序方法中平均性能最好的。但是快读排序不稳定。
选择类排序:直接选择排序,和直接插入排序作比较,其实差不多,不过这里是选择最小的一个作为有序列的R[1],进行n-1趟排序。也是不稳定的,算法复杂度O(n2)
归并排序:顾名思义,是合并,将一些较小的有序的序列进行合并从而成为整个有序序列。他是稳定的排序,复杂度为O(nlgn),一般应用时先采用直接插入排序得到几个有序序列,然后再进行归并,这样仍然是稳定的。
完了之后就是要把思路转化为程序。毕竟写出程序的能力才是最终要有的。
#include <stdio.h>
#include <stdlib.h> #define n 8 typedef struct
{
int key;
}rectype;
rectype R[n+]; void insertsort(rectype R[])
{
int i,j;
for(i=;i<=n;i++)
{
if(R[i].key<R[i-].key)
{
R[]=R[i];
j=i-;
while(R[].key<R[j].key)
{
R[j+]=R[j--];//jiang guanjianzi dayu R[i].key de jilu houyi
}
R[j+]=R[];
}
}
}
void shellsort(rectype R[],int d[],int t)
{
int i,j,k;
for(k=;k<t;k++)
for(i=d[k]+;i<=n;i++)
if(R[i].key<R[i-d[k]].key)
{
R[]=R[i];
j=i-d[k];
while(j>&&R[].key<R[j].key)
{
R[j+d[k]]=R[i];
j=j-d[k];
R[j-d[k]]=R[];
}
}
} void bubblesort(rectype R[])
{
int i,j,swap;
for(i=;i<n;i++)
{
swap=;
for(j=n;j>i;j--)
if(R[j-].key>R[j].key)
{
R[]=R[j-];
R[j-]=R[j];
R[j]=R[];
swap=;
}
if(!swap) break;
}
} int partition(rectype R[],int low,int high)
{
rectype pivot=R[low];
while(low<high)
{
while(low<high&&R[high].key>=pivot.key)
high--;
if(low<high)
R[low++]=R[high];
while(low<high&&R[low].key<=pivot.key)
low++;
if(low<high)
R[high--]=R[low];
}
R[low]=pivot;
return low;
} void quicksort(rectype R[],int s,int t)
{
int i;
if(s<t)
{
i=partition(R,s,t);
quicksort(R,s,i-);
quicksort(R,i+,t);
}
} void selectsort(rectype R[],int m)
{
int i,j,k;
rectype temp;
for(i=;i<m;i++)
{
k=i;
for(j=i+;j<=m;j++)
if(R[j].key<R[k].key)
k=j;
if(k!=i)
{
temp=R[i];
R[i]=R[k];
R[k]=temp;
}
}
} void merge(rectype R[],int low,int mid,int high)
{
int i,j,k;
i=low;j=mid+;k=;
rectype *R1=(rectype*)malloc((high-low+)*sizeof(rectype));
if(!R1){printf("failed");exit();}
while((i<=mid)&&(j<=high))
{
if(R[i].key<=R[j].key)
R1[k++]=R[i++];
else
R1[k++]=R[j++];
}
while(i<=mid) R1[k++]=R[i++];
while(j<=high) R1[k++]=R[j++];
for(k=,i=low;i<high;k++,i++)
R[i]=R1[k];
} void mergepass(rectype R[],int length)
{
int i=;
while(i+*length-<=n)
{
merge(R,i,i+length-,i+*length-);
i=i+*length;
}
if((i+length-)<n)
{
merge(R,i,i+length-,n-);
}
} void mergesort(rectype R[])
{
int length;
for(length=;length<n;length*=)
mergepass(R,length);
} int main()
{
int i;
int d[]={,,};
rectype R[]={{},{},{},{},{},{},{},{},{}};
insertsort(R);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
shellsort(R,d,);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
bubblesort(R);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
quicksort(R,,);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
selectsort(R,);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
mergesort(R);
for(i=;i<=n;i++)
printf("%d ",R[i].key);
printf("\n");
}
C语言排序算法复习的更多相关文章
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
- C语言排序算法学习笔记——插入类排序
排序就是讲原本无序的序列重新排序成有序的序列.序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序. 排序的稳定性:如果排序表中有两个元素R1,R2,其对应的 ...
- C语言 排序算法
冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来. 过程演示: 选 ...
- c语言排序算法总结
一.希尔(Shell)排序法 /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) { int gap,i,j, ...
- C语言排序算法学习笔记——交换类排序
交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...
- 两种常用的C语言排序算法
1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include &l ...
- C语言排序算法
(1)“冒泡法” 冒泡法大家都较熟悉.其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n].同理对a[1],a[2],...a[n-1]处理,即 ...
- C语言排序算法学习笔记——选择类排序
选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...
- C语言 排序算法总结
#include<stdio.h> #include<stdlib.h> //作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ # ...
随机推荐
- wxpython下的桥梁信息管理系统
github地址:https://github.com/billiepander/BIMS 第一版: 现在实现了登陆,与部门级别用户录入桥梁检测信息后保存为excel(后期要用数据库存一些关键信息,为 ...
- python代码合并
http://www.baidu.com/s?wd=python%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6&rsv_bp=0&ch=&tn=mon ...
- C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)
//大家在做报表或查询的时候都会有给用户预设一些可选的日期范围(如上图) //如本年度销售额.本季度利润.本月新增客户 //C#里内置的Da ...
- solr单机版的搭建
一.solr单机版的搭建 1.运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(ja),本教va写的Servlet容器程 ...
- vim 学习笔记
vim介绍:一款编辑器,另外一般linux系统会自带,所以一般linux下日志.配置文件等 纯文本文件的修改编辑等通过vim操作 学会的好处:1 方便操作linux下日志.配置文件等纯文本文件 2 功 ...
- oracle 复制一条记录只改变主键不写全部列名
场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中. procedure P_TES ...
- 武汉科技大学ACM:1005: Soapbear and Honey
Problem Description Soapbear is the mascot of WHUACM team. Like other bears, Soapbear loves honey ve ...
- Linux中的搜索命令
find find是最常见和最强大的查找命令,在磁盘中查找文件,用它找到任何你想找的文件,就是速度有点慢. find path -option [ -print ] [ ...
- eclipse下编译openfire3.9.1源码
[一].下载源码 打开网址:http://www.igniterealtime.org/downloads/source.jsp 选择目前最新版本 openfire_src_3_9_1.zip 下载. ...
- Python学习笔记五--条件和循环
5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...