12-C语言排序算法
计数排序(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语言排序算法相关推荐
- C语言排序算法(十种排序代码可跑
C语言排序算法(十种排序代码可跑) 冒泡排序: 选择排序: 插入排序: 归并排序: 快速排序: 希尔排序: 堆排序: 计数排序: 桶排序: 基数排序: 以上就是所有代码,希望同学们好好学习!!! 冒泡 ...
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来 ...
- c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc
基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...
- 对于c语言排序方法的论文,c语言排序算法论文.doc
c语言排序算法论文 算法论文 题目名称:<c语言常用排序算法分析> 系部名称:计算机科学与工程 班 级: 学 号: 学生姓名: 指导教师: 2014年4月 c语言常用排序算法分析 摘 要 ...
- C语言排序算法(一)——选择排序实现
C语言排序算法(一)--选择排序实现 编写程序,实现从键盘输入10个数,并用选择法从小到大排序. 简单选择排序的基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换:第2 ...
- c语言排序算法实际案例,[C语言] 部分经典排序算法详解(有图解)
目录 1.内容概括 2.主要算法 3.技术的具体应用 4.算法实际应用 5.总结 0.前言 在上一篇文章<[C语言] 数组的实际应用三则>中我们提到了数组的一些基础知识,并通过三个实际例子 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- 江哥带你玩转C语言 | 11- C语言排序算法
计数排序(Counting Sort) 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法. ...
- c语言排序算法(使用链表)
存储结构: #define MAXSIZE 20 typedef int keytype; typedef struct { keytype key;InfoType otherinfo; /*没有可 ...
最新文章
- sip 时序图_时序图怎么看_教你如何看懂时序图 - 什么是时序图_时序图怎么看_教你如何看懂时序图...
- 深入理解计算机系统(3.4)------算术和逻辑操作
- java中容易混淆的方法_java中容易混淆的概念
- hbase查询_【从零单排HBase】HBase高性能查询揭秘
- OAuth 2.0 的探险之旅
- android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...
- 程序员造轮子的正确姿势
- python 函数 过程_Python开发之【集合、函数和过程】
- 使用异步任务加载网络上的图片
- Microsoft.NET Pet Shop 4.0各个模块之间的联系
- python函数定义及调用-python 函数定义及调用
- EPLAN 2.7 WIN 10 X64安装说明
- python 生成器
- 服务器推送微信订阅消息,微信小程序-订阅消息服务通知
- 学习笔记 Tianmao 篇 使用简单封装后的自定义OkHttp 获取json被GSON解析后的数据
- 目标追踪(一)环境搭建
- Word中插入集合和元素的包含符号
- R语言在图上标出点坐标_R语言做图plot参数
- 【笔记总结】计算机系期末复习、专业课学习、算法与其他笔记
- ISO26262标准概览