c语言的5种常用排序算法

1、冒泡排序(最常用)
冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)

  • 以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
#include<stdio.h>
int main()
{int i,j,t,a[10];printf("输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++)                //变量i仅代表比较的趟数(n-1)趟for(j=0;j<9-i;j++)if(a[j]>a[j+1])            //相邻两个数相互比较{t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i<10;i++)printf("%5d",a[i]);printf("\n");return 0;
}

2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

#include<stdio.h>
int main()
{void cocktail_sort(int a[],int left,int right);int i,a[10];    printf("输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);cocktail_sort(a,0,9);for(i=0;i<10;i++)printf("%5d",a[i]);  printf("\n");return 0;
}
void cocktail_sort(int a[],int left,int right)
{if(left>=right){return;}int i,t;if(left<right){for(i=left;i<right;i++)if(a[i]>a[i+1])//最大值移动到最右端处{t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=right;i>left;i--)if(a[i]<a[i-1])//最小值移动到最左端处{t=a[i];a[i]=a[i-1];a[i-1]=t;}cocktail_sort(a,left+1,right-1);   //重复运算,直到left>=right(此处使用递归调用)}
}

3、快速排序(Quicksort)【是对冒泡排序的一种改进】
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了
原理
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选
用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

#include<stdio.h>
int main()
{void quicksort(int a[],int left,int right);//函数声明int i,a[10];printf("输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);quicksort(a,0,9);for(i=0;i<10;i++)printf("%5d",a[i]);printf("\n");return 0;
}
void quicksort(int a[],int left,int right)//函数实现快速排序
{if(left>=right)        /*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/{return;}int i=left;int j=right;int key=a[left];while(i<j){while(i<j && key<=a[j])/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ j--;   /*向前寻找*/a[i]=a[j]; /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是a[left],那么就是给key)*/while(i<j && key>=a[i])       /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/i++;a[j]=a[i];        /*当在当组内找完一遍以后就把中间数key回归*/}a[i]=key;quicksort(a,left,i-1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/quicksort(a,i+1,right);/*用同样的方式对分出来的右边的小组进行同上的做法*//*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

4、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。

#include<stdio.h>
int main()
{int i,j,t,a[10];printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);    //输入10个整数存到数组里for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(a[i]>a[j])     //如果前一个数比后一个大,则调换值{t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i<10;i++)printf("%d  ",a[i]);printf("\n");return 0;
}

5、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5

#include<stdio.h>
int main()
{void insert(int a[],int first,int last);int i,a[10];   printf("输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);insert(a,0,9);for(i=0;i<10;i++)printf("%5d",a[i]); printf("\n");return 0;
}
void insert(int a[],int first,int last)
{int i,j,t;for(i=first+1;i<=last;i++){t=a[i];j=i-1;while((j>=0) && (a[j]>t))//与已排序的数逐一比较,大于t时,该数移后{a[j+1]=a[j];j--;}// if(j!=i-1)a[j+1]=t;}
}

c语言的5种常用排序方法相关推荐

  1. C语言常用排序方法大全

    C语言常用排序方法大全 /* ============================================================================= 相关知识介绍( ...

  2. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  3. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  4. C语言 · 运用结构体的排序方法

    AllSight C语言 · 运用结构体的排序方法 之前遇到排序只想着最原始的方法,诸如冒泡,选择,快速排序等等,刚刚跟大牛学会了结构体的方法来排序,这样的话以后再也不用怕成绩统计.名次排序之类的题目 ...

  5. 基于 Python 的 8 种常用抽样方法

    抽样是统计学.机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到.所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本. 上 ...

  6. [转载] java实现四种常用排序算法

    参考链接: 用Java排序 四种常用排序算法 ##注:从小到大排 ##冒泡排序## 特点:效率低,实现简单 思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有 ...

  7. R中两种常用并行方法——2. snowfall

    上一篇博客(R中两种常用并行方法--1. parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂 ...

  8. 数字图像处理——12种常用图像处理方法对比

    数字图像处理--12种常用图像处理方法对比 1.图像反转 2.对数变换 3.幂次变换 4.分段函数 5.直方图均衡化 6.直方图规定化 7.直方图匹配 8.线性滤波 9.中值滤波与均值滤波 10.拉普 ...

  9. 微信分销商城小程序几种常用开发方法

    一.微信分销商城小程序几种常用开发方法 1.自主开发 这种方式是很多企业考虑的,但这种开发方式的前提是有自己的开发团队或重新组建开发团队.无论是重组自己的开发团队还是有自己开发团队,功能要求.前后端开 ...

最新文章

  1. python自动退出程序_python异常退出
  2. python label位置_Python3 tkinter基础 Label pack 设置控件在窗体中的位置
  3. macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝
  4. python之爬虫(四)之 Requests库的基本使用
  5. ES6新特性_Promise对象的catch方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记029
  6. JS框架_(Progress.js)圆形动画进度条
  7. linux php执行ci框架,PHP CI框架学习之路径访问
  8. 详解Transformer
  9. 关于Secureboot的简单介绍[结合rk平台]
  10. shell-一些有趣的使用
  11. 加密日记 android,Lifeograph加密日记应用程序
  12. xp怎么看计算机是多少位的,WinXP系统怎么看电脑是32位还是64位?
  13. WeaveSocket框架-Unity太空大战游戏-客户端-3
  14. 关于“明显没有bug的代码”的一些拙见
  15. 【k8s】debug iptable 并追踪
  16. 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案
  17. Phun:一个巨牛B的物理引擎
  18. antlr 安装使用
  19. docker容器 如何精简镜像减小体积
  20. AsyncTask 用法

热门文章

  1. 【git问题】couldn‘t find remote ref
  2. WiseHome家政预约小程序 v1.3.1
  3. 归并排序算法详解及示例
  4. 为什么要 “打工人” ?
  5. 车站计算机系统的组成及基本功能,城市轨道交通自动售检票系统的组成与功能...
  6. 圣诞夜工程师写了表白情诗,你会沉迷哪一首?
  7. input里添加小图标 (实用、赞)
  8. (基于安卓app开发的毕业设计)智能手机图片管理.(附源码+论文)
  9. 配置阿里云负载均衡全站HTTPS集群
  10. Verilog 串行FIR滤波器、并行FIR滤波器设计、FIR IP核实现