计数排序(Counting Sort)

  • 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。
  • 排序思路:
    • 1.找出待排序数组最大值
    • 2.定义一个索引最大值为待排序数组最大值的数组
    • 3.遍历待排序数组, 将待排序数组遍历到的值作新数组索引
    • 4.在新数组对应索引存储值原有基础上+1

  • 简单代码实现:
int main()
{// 待排序数组int nums[5] = {3, 1, 2, 0, 3};// 用于排序数组int newNums[4] = {0};// 计算待排序数组长度int len = sizeof(nums) / sizeof(nums[0]);// 遍历待排序数组for(int i = 0; i < len; i++){// 取出待排序数组当前值int index = nums[i];// 将待排序数组当前值作为排序数组索引// 将用于排序数组对应索引原有值+1newNums[index] = newNums[index] +1;}// 计算待排序数组长度int len2 = sizeof(newNums) / sizeof(newNums[0]);// 输出排序数组索引, 就是排序之后结果for(int i = 0; i < len2; i++){for(int j = 0; j < newNums[i]; j++){printf("%i\n", i);}}/*// 计算待排序数组长度int len2 = sizeof(newNums) / sizeof(newNums[0]);// 还原排序结果到待排序数组for(int i = 0; i < len2; i++){int index = 0;for(int i = 0; i < len; i++){for(int j = 0; j < newNums[i]; j++){nums[index++] = i;}}}*/return 0;
}

选择排序

  • 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

  • 排序思路:

    • 假设按照升序排序
    • 1.用第0个元素和后面所有元素依次比较
    • 2.判断第0个元素是否大于当前被比较元素, 一旦小于就交换位置
    • 3.第0个元素和后续所有元素比较完成后, 第0个元素就是最小值
    • 4.排除第0个元素, 用第1个元素重复1~3操作, 比较完成后第1个元素就是倒数第二小的值
    • 以此类推, 直到当前元素没有可比较的元素, 排序完成
  • 代码实现:


// 选择排序
void selectSort(int numbers[], int length) {// 外循环为什么要-1?// 最后一位不用比较, 也没有下一位和它比较, 否则会出现错误访问for (int i = 0; i < length; i++) {for (int j = i; j < length - 1; j++) {// 1.用当前元素和后续所有元素比较if (numbers[i] < numbers[j + 1]) {//  2.一旦发现小于就交换位置swapEle(numbers, i, j + 1);}}}
}
// 交换两个元素的值, i/j需要交换的索引
void swapEle(int array[], int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;
}

冒泡排序

  • 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复 地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

  • 排序思路:
    • 假设按照升序排序
    • 1.从第0个元素开始, 每次都用相邻两个元素进行比较
    • 2.一旦发现后面一个元素小于前面一个元素就交换位置
    • 3.经过一轮比较之后最后一个元素就是最大值
    • 4.排除最后一个元素, 以此类推, 每次比较完成之后最大值都会出现再被比较所有元素的最后
    • 直到当前元素没有可比较的元素, 排序完成
  • 代码实现:
// 冒泡排序
void bubbleSort(int numbers[], int length) {for (int i = 0; i < length; i++) {// -1防止`角标越界`: 访问到了不属于自己的索引for (int j = 0; j < length - i - 1; j++) {//  1.用当前元素和相邻元素比较if (numbers[j] < numbers[j + 1]) {//  2.一旦发现小于就交换位置swapEle(numbers, j, j + 1);}}}
}
// 交换两个元素的值, i/j需要交换的索引
void swapEle(int array[], int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;
}

插入排序

  • 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  • 排序思路:
    • 假设按照升序排序
    • 1.从索引为1的元素开始向前比较, 一旦前面一个元素大于自己就让前面的元素先后移动
    • 2.直到没有可比较元素或者前面的元素小于自己的时候, 就将自己插入到当前空出来的位置
  • 代码实现:
int main()
{// 待排序数组int nums[5] = {3, 1, 2, 0, 3};// 0.计算待排序数组长度int len = sizeof(nums) / sizeof(nums[0]);//  1.从第一个元素开始依次取出所有用于比较元素for (int i = 1; i < len; i++){// 2.取出用于比较元素int temp = nums[i];int j = i;while(j > 0){// 3.判断元素是否小于前一个元素if(temp < nums[j - 1]){// 4.让前一个元素向后移动一位nums[j] = nums[j - 1];}else{break;}j--;}// 5.将元素插入到空出来的位置nums[j] = temp;}
}
int main()
{// 待排序数组int nums[5] = {3, 1, 2, 0, 3};// 0.计算待排序数组长度int len = sizeof(nums) / sizeof(nums[0]);//  1.从第一个元素开始依次取出所有用于比较元素for (int i = 1; i < len; i++){// 2.遍历取出前面元素进行比较for(int j = i; j > 0; j--){// 3.如果前面一个元素大于当前元素,就交换位置if(nums[j-1] > nums[j]){int temp = nums[j];nums[j] = nums[j - 1];nums[j - 1] = temp;}else{break;}}}
}

希尔排序

  • 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

  • 排序思路:
    • 1.希尔排序可以理解为插入排序的升级版, 先将待排序数组按照指定步长划分为几个小数组
    • 2.利用插入排序对小数组进行排序, 然后将几个排序的小数组重新合并为原始数组
    • 3.重复上述操作, 直到步长为1时,再利用插入排序排序即可
  • 代码实现:
int main()
{// 待排序数组int nums[5] = {3, 1, 2, 0, 3};// 0.计算待排序数组长度int len = sizeof(nums) / sizeof(nums[0]);// 2.计算步长int gap = len / 2;do{//  1.从第一个元素开始依次取出所有用于比较元素for (int i = gap; i < len; i++){// 2.遍历取出前面元素进行比较int j = i;while((j - gap) >= 0){printf("%i > %i\n", nums[j - gap], nums[j]);// 3.如果前面一个元素大于当前元素,就交换位置if(nums[j - gap] > nums[j]){int temp = nums[j];nums[j] = nums[j - gap];nums[j - gap] = temp;}else{break;}j--;}}// 每个小数组排序完成, 重新计算步长gap = gap / 2;}while(gap >= 1);
}

江哥提示:
对于初学者而言, 排序算法一次不易于学习太多, 咋们先来5个玩一玩, 后续继续讲解其它5个


折半查找

  • 基本思路
  • 在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找;
  • 若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。不断重复上述查找过 程,直到查找成功,或所查找的区域无数据元素,查找失败

  • 实现步骤

  • 在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;

  • 若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找;

  • 若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。

  • 不断重复上述查找过 程,直到查找成功,或所查找的区域无数据元素,查找失败。

  • 代码实现

int findKey(int values[], int length, int key) {// 定义一个变量记录最小索引int min = 0;// 定义一个变量记录最大索引int max = length - 1;// 定义一个变量记录中间索引int mid = (min + max) * 0.5;while (min <= max) {// 如果mid对应的值 大于 key, 那么max要变小if (values[mid] > key) {max = mid - 1;// 如果mid对应的值 小于 key, 那么min要变}else if (values[mid] < key) {min = mid + 1;}else {return mid;}// 修改完min/max之后, 重新计算mid的值mid = (min + max) * 0.5;}return -1;
}

进制转换(查表法)

  • 实现思路:

    • 将二进制、八进制、十进制、十六进制所有可能的字符都存入数组
    • 利用按位与运算符和右移依次取出当前进制对应位置的值
    • 利用取出的值到数组中查询当前位输出的结果
    • 将查询的结果存入一个新的数组, 当所有位都查询存储完毕, 新数组中的值就是对应进制的值
  • 代码实现
#include <stdio.h>
void toBinary(int num)
{total(num, 1, 1);
}
void toOct(int num)
{total(num, 7, 3);
}
void toHex(int num)
{total(num, 15, 4);
}void total(int num , int base, int offset)
{//    1.定义表用于查询结果char cs[] = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b','c', 'd', 'e', 'f'};//    2.定义保存结果的数组char rs[32];//    计算最大的角标位置int length = sizeof(rs)/sizeof(char);int pos = length;//8while (num != 0) {int index = num & base;rs[--pos] = cs[index];num = num >> offset;}for (int i = pos; i < length; i++) {printf("%c", rs[i]);}printf("\n");
}
int main()
{toBinary(9);return 0;
}

12-C语言排序算法相关推荐

  1. C语言排序算法(十种排序代码可跑

    C语言排序算法(十种排序代码可跑) 冒泡排序: 选择排序: 插入排序: 归并排序: 快速排序: 希尔排序: 堆排序: 计数排序: 桶排序: 基数排序: 以上就是所有代码,希望同学们好好学习!!! 冒泡 ...

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

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

  3. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  4. 对于c语言排序方法的论文,c语言排序算法论文.doc

    c语言排序算法论文 算法论文 题目名称:<c语言常用排序算法分析> 系部名称:计算机科学与工程 班 级: 学 号: 学生姓名: 指导教师: 2014年4月 c语言常用排序算法分析 摘 要 ...

  5. C语言排序算法(一)——选择排序实现

    C语言排序算法(一)--选择排序实现 编写程序,实现从键盘输入10个数,并用选择法从小到大排序. 简单选择排序的基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换:第2 ...

  6. c语言排序算法实际案例,[C语言] 部分经典排序算法详解(有图解)

    目录 1.内容概括 2.主要算法 3.技术的具体应用 4.算法实际应用 5.总结 0.前言 在上一篇文章<[C语言] 数组的实际应用三则>中我们提到了数组的一些基础知识,并通过三个实际例子 ...

  7. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  8. 江哥带你玩转C语言 | 11- C语言排序算法

    计数排序(Counting Sort) 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法. ...

  9. c语言排序算法(使用链表)

    存储结构: #define MAXSIZE 20 typedef int keytype; typedef struct { keytype key;InfoType otherinfo; /*没有可 ...

最新文章

  1. sip 时序图_时序图怎么看_教你如何看懂时序图 - 什么是时序图_时序图怎么看_教你如何看懂时序图...
  2. 深入理解计算机系统(3.4)------算术和逻辑操作
  3. java中容易混淆的方法_java中容易混淆的概念
  4. hbase查询_【从零单排HBase】HBase高性能查询揭秘
  5. OAuth 2.0 的探险之旅
  6. android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...
  7. 程序员造轮子的正确姿势
  8. python 函数 过程_Python开发之【集合、函数和过程】
  9. 使用异步任务加载网络上的图片
  10. Microsoft.NET Pet Shop 4.0各个模块之间的联系
  11. python函数定义及调用-python 函数定义及调用
  12. EPLAN 2.7 WIN 10 X64安装说明
  13. python 生成器
  14. 服务器推送微信订阅消息,微信小程序-订阅消息服务通知
  15. 学习笔记 Tianmao 篇 使用简单封装后的自定义OkHttp 获取json被GSON解析后的数据
  16. 目标追踪(一)环境搭建
  17. Word中插入集合和元素的包含符号
  18. R语言在图上标出点坐标_R语言做图plot参数
  19. 【笔记总结】计算机系期末复习、专业课学习、算法与其他笔记
  20. ISO26262标准概览

热门文章

  1. Parallel并行计算合计数据时错误的原因和解决办法
  2. VC对话框全屏显示及相应控件位置改变(转)
  3. C#中选择文件的例子
  4. 基于Springboot实现宠物医院综合管理系统
  5. 项目通用环境使用说明
  6. python正态分布相关函数
  7. P3374 【模板】树状数组 1
  8. mybatis基础,mybatis配置文件核心组件typeHandler元素
  9. 基础知识漫谈(3) 组合基础知识,设计游戏框架
  10. Android Studio 更换国内源下载依赖库