桶排序

5 3 5 2 8

这个算法就好比预先有几个桶【暂定为11个】,编号从0~10。每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就OK 了。例如2 号桶中有1 个小旗子,表示2 出现了一次;3 号桶中有1 个小旗子,表示3 出现了一次;5 号桶中有2 个小旗子,表示5出现了两次;8 号桶中有1 个小旗子,表示8 出现了一次。

#include <stdio.h>
int main()
{int book[1001],i,j,t,n;for(i=0;i<=1000;i++)book[i]=0;scanf("%d",&n);//输入一个数n,表示接下来有n个数for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序{scanf("%d",&t); //把每一个数读到变量t中book[t]++; //进行计数,对编号为t的桶放一个小旗子}for(i=1000;i>=0;i--) //依次判断编号1000~0的桶for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次printf("%d ",i);
getchar();getchar();
return 0;
}

桶排序可以用来对数据元素去重

冒泡排序

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来


冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是O(N 2)

#include <stdio.h>
int main()
{int a[100],i,j,t,n;
scanf("%d",&n); //输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++) //循环读入n个数到数组a中scanf("%d",&a[i]);
//冒泡排序的核心部分
for(i=1;i<=n-1;i++) //n个数排序,只用进行n-1趟
{for(j=1;j<=n-i;j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什么到n-i就可以了。{if(a[j]<a[j+1]) //比较大小并交换{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }}
}
for(i=1;i<=n;i++) //输出结果
printf("%d ",a[i]);
getchar();getchar();
return 0;
}
//可以输入以下数据进行验证。
10
8 100 50 22 15 6 1 1000 999 0
//运行结果是:
0 1 6 8 15 22 50 100 999 1000

快速排序

假设现在对“6 1 2 7 9 3 4 5 10 8”这10 个数进行排序。

第一个数6 作为基准数吧。接下来,需要将这个序列中
所有比基准数大的数放在6 的右边,比基准数小的数放在6 的左边,类似下面这种排列。

3 1 2 5 4 6 9 7 10 8


方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6 的数,再从左往右找一个大于6 的数,然后交换它们。这里可以用两个变量i 和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i 指向序列的最左边(即i=1),指向数字6。让哨兵j 指向序列的最右边(即j=10),指向数字8。


首先哨兵j 开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j 先出动,这一点非常重要(请自己想一想为什么)。哨兵j 一步一步地向左挪动(即j–),直到找到一个小于6 的数停下来。接下来哨兵i 再一步一步向右挪动(即i++),直到找到一个大于6的数停下来。最后哨兵j 停在了数字5 面前,哨兵i 停在了数字7 面前。

现在交换哨兵i 和哨兵j 所指向的元素的值。交换之后的序列如下。

6 1 2 5 9 3 4 7 10 8


到此,第一次交换结束。接下来哨兵j 继续向左挪动(再次友情提醒,每次必须是哨兵j 先出发)。他发现了4(比基准数6 要小,满足要求)之后停了下来。哨兵i 也继续向右挪动,他发现了9(比基准数6 要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下。

6 1 2 5 4 3 9 7 10 8


第二次交换结束,“探测”继续。哨兵j 继续向左挪动,他发现了3(比基准数6 要小,满足要求)之后又停了下来。哨兵i 继续向右移动,糟啦!此时哨兵i 和哨兵j 相遇了,哨
兵i 和哨兵j 都走到3 面前。说明此时“探测”结束。我们将基准数6 和3 进行交换。交换之后的序列如下

3 1 2 5 4 6 9 7 10 8


到此第一轮“探测”真正结束。此时以基准数6 为分界点,6 左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j 的使命就是要找小于基准数的数,而哨兵i 的使命就是要找大于基准数的数,直到i 和j 碰头为止。

OK,解释完毕。现在基准数6 已经归位,它正好处在序列的第6 位。此时我们已经将原来的序列,以6 为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。接下来还需要分别处理这两个序列,因为6 左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6 左边和右边的序列即可。

####快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right){int i,j,t,temp;if(left>right)return;temp=a[left]; //temp中存的就是基准数i=left;j=right;while(i!=j){//顺序很重要,要先从右往左找while(a[j]>=temp && i<j)j--;//再从左往右找while(a[i]<=temp && i<j)i++;//交换两个数在数组中的位置if(i<j)//当哨兵i和哨兵j没有相遇时{t=a[i];a[i]=a[j];a[j]=t;}}
//最终将基准数归位a[left]=a[i];a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程
}
int main()
{int i,j,t;//读入数据scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);quicksort(1,n); //快速排序调用//输出排序后的结果for(i=1;i<=n;i++)printf("%d ",a[i]);getchar();getchar();
return 0;
}
//可以输入以下数据进行验证。
//10
//6 1 2 7 9 3 4 5 10 8
//运行结果是:
//1 2 3 4 5 6 7 8 9 10

排序算法(c语言版)相关推荐

  1. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

  2. 《数据结构与算法 C语言版》—— 3.8习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第3章,第3.8节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.8习题 1名 ...

  3. 《数据结构与算法 C语言版》—— 2.5上机实验

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.5节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.5上机实验 实 ...

  4. 《数据结构与算法 C语言版》—— 2.7习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.7节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.7习题 1描 ...

  5. 经典排序算法(Java版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...

  6. c语言实现感知器算法,感知器算法(c语言版).doc

    感知器算法(c语言版).doc includestdio.hincludetime.hdefine C 1void mainint i,j,k,N1,N2,x202,s3,d20,array204,w ...

  7. c语言遍历算法的头文件,图优先遍历算法(C语言版).doc

    图优先遍历算法(C语言版) 众炼向饭桨泞奉源柿虐萧宰徽强药邻摘甭膜酣猖椅支习洋瞪较效笋盏厚婪跳博险僳乘措笆却问谬闸皇机兽偿谐芹违邹竞芬襟竣备烘令救汇邵叙鹰扭肾钙苏辅捕先是埠郧苛三驯溅烂右井准刮修柒拿苇 ...

  8. 【转载】CRC32校验算法C语言版(查表法)

    先放原文链接:CRC32校验算法C语言版(查表法) 这几天搞串口通信,用到CRC32,把以前用到的东西整理一下,方便以后使用. STM32F103 芯片自带的CRC32硬件算法,匹配上位机CRC32算 ...

  9. 快速排序的随机化算法C语言版

    快速排序的随机化算法C语言版 #include<stdio.h> #include<stdlib.h> void quicksort(int *a, int left, int ...

最新文章

  1. 关于text段、data段和bss段
  2. mysql数据库使用
  3. linux软中断的实现
  4. springcloud ribbon @LoadBalance负载均衡源码流程分析
  5. 干货|吴恩达Coursera课程教你学习神经网络!
  6. 进程中的一个线程死了所引发的后果
  7. 毕业设计-人脸表情识别系统、人工智能
  8. SpringBoot+Thyemleaf报错Template might not exist or might not be accessible
  9. 找不到libmmd.dll无法继续执行代码_代码中的软件工程 - xieyupei
  10. JS调用WebService
  11. 将给出的整数x翻转_LeetCode(七)整数反转
  12. 【软件工程】软件需求说明书、概要设计说明书、详细设计说明书参考模板
  13. c语言程序训练营,王道训练营-C语言-1
  14. java jco sap 重连_JCO重连SAP
  15. 虚拟机下搭建一个dns服务器,虚拟机下DNS服务器配置.doc
  16. 计算机号密码保护,如何使用BIOS或UEFI密码保护计算机 | MOS86
  17. mysql error 1236_MySQL Got fatal error 1236原因和解决方法
  18. [论文]欠驱动水下机器人的平面轨迹规划与跟踪控制设计
  19. MLAPP————第五章 贝叶斯统计
  20. 服务器项目描述,项目服务器 2010 SP2 的描述

热门文章

  1. 计算机组成原理唐朔飞难点,《计算机组成原理》唐朔飞 重点、难点.ppt
  2. Unity 简单背包系统(ScriptableObject)
  3. 都是被逼的... ,LM算法的具体实现python和C++代码
  4. TypeError: Cannot read property ‘$createElement‘ of undefined
  5. 高等数学学习笔记——第四十六讲——反常积分
  6. onnxruntime gpu 推理
  7. vue中使用网易云盾的动态验证码
  8. VS2017 C++开发环境插件推荐
  9. BugPhobia开发篇章:绩效管理的层次优化
  10. Java在线教育项目 第九天黑马头条爬虫