菜单导航

1、冒泡排序

2、选择排序

3、折半查询

4、进制查表(十进制转二进制、八进制、十六进制)

一、冒泡排序

//1、冒泡排序
/** 一组无序数字,进行从小到大排序
冒泡排序的过程:就是每个循环从第一个元素开始,相邻两个元素进行比较,前面的比后面的大,则进行值交换;
则第一次循环把最大值排到了最后,第二次循环把第二大的值排到了倒数第二位...以此类推;
把最大值想象成最大气泡,相邻气泡进行比较,较大气泡排到后面,最大气泡先冒到最后面。。。。
每次循环的比较个数次数从元素个数-1 到 1,假如5个元素,则循环比较的个数为:
****
***
**
*
*/
int arr[] = {, , , , };
int arrCount = sizeof(arr) / sizeof(arr[]);
printf("排序前的数组元素顺序为:\n");
for (int i = ; i < arrCount; i++) {
printf("%d ", arr[i]);
}
printf("\n\n开始进行冒泡排序:\n"); //进行冒泡排序
for (int i = ; i < arrCount; i++) {
for (int j = ; j < arrCount - i - ; j++) {
if (arr[j] > arr[j+]){
int tmp = arr[j];
arr[j] = arr[j+];
arr[j+] = tmp;
}
printf("*");
}
printf("\n");
} printf("排序后的数组元素排序为:\n");
for (int i = ; i < arrCount; i++) {
printf("%d ", arr[i]);
}
printf("\n\n"); /** 打印结果:
排序前的数组元素顺序为:
88 18 99 6 72 开始进行冒泡排序:
****
***
**
* 排序后的数组元素排序为:
6 18 72 88 99
*/

二、选择排序

//2、选择排序
/** 一组无序数字,进行从小到达排序
选择排序的过程:和冒泡排序有点相反的是每次循环中某一个元素和数组里面所有的元素进行比较,
然后每次循环都是把最小的排到最前面;
比如第一次循环把最小大排到最前面;第二次循环把第二小的排到第二位;
循环次数和冒泡排序一样
*/
int arr2[] = {, , , , };
int arr2Count = sizeof(arr2) / sizeof(arr2[]);
printf("排序前的数组元素顺序为:\n");
for (int i = ; i < arr2Count; i++) {
printf("%d ", arr2[i]);
}
printf("\n\n开始进行选择排序:\n"); //进行冒泡排序
for (int i = ; i < arr2Count; i++) {
for (int j = i+; j < arr2Count; j++) {
if (arr2[i] > arr2[j]){
int tmp = arr2[i];
arr2[i] = arr2[j];
arr2[j] = tmp;
}
printf("*");
}
printf("\n");
} printf("排序后的数组元素排序为:\n");
for (int i = ; i < arr2Count; i++) {
printf("%d ", arr2[i]);
}
printf("\n\n");
/** 打印结果:
排序前的数组元素顺序为:
11 102 99 2 82 开始进行选择排序:
****
***
**
* 排序后的数组元素排序为:
2 11 82 99 102
*/

三、折半查询

#include <stdio.h>
#include <time.h> int main(int argc, const char * argv[]) { //3、折半查找:一组有序的数字,想快速找到某一个值对应的位置,进行插入或者删除,可以用到折半查询
int arr3[]; //定义一个一万个元素的数组
//给数组按顺序赋值
for (int i = ; i < ; i++) {
arr3[i] = i * ;
} //问题1:查询1000值所在的位置、查询次数、耗时
//1.1 先按顺序查询 clock_t startTime = clock(); //开始时间
clock_t endTime = clock(); //结束时间
int selectCount = ; //查询次数
int target = ; for (int i = ; i < ; i++) {
if (arr3[i] == target){
endTime = clock();
selectCount = i+;
break;
}
}
printf("按顺序查询%d值位置共查询次数%d次, 耗时%ld毫秒 \n", target, selectCount, endTime-startTime); startTime = clock(), endTime = clock();
selectCount = ;
//1.2 折半查询
int min = ; //最小索引
int max = ; //最大索引
for (int i = ; i < ; i++) {
int mid = (min + max)/; if (arr3[mid] > target){
max = mid; //如果数组最中间索引的值大于要查询的目标值,则最大索引设置为中间索引
}
else if (arr3[mid] < target){
min = mid; //如果数组最中间索引的值小于查询的目标值,则最小索引设置为中间索引
}
else{
endTime = clock();
selectCount = i + ;
break;
}
}
printf("折半查询%d值的位置共查询次数%d次,耗时%ld毫秒 \n", target, selectCount, endTime-startTime); //问题2:查询18000值所在的位置、耗时、查询次数
//2.1 顺序查询
target = ;
startTime = clock(), endTime = clock();
selectCount = ; for (int i = ; i < ; i++) {
if (arr3[i] == target){
endTime = clock();
selectCount = i+;
break;
}
}
printf("按顺序查询%d值位置共查询次数%d次, 耗时%ld毫秒 \n", target, selectCount, endTime-startTime); startTime = clock(), endTime = clock();
selectCount = ;
//2.2 折半查询
min = ; //最小索引
max = ; //最大索引
for (int i = ; i < ; i++) {
int mid = (min + max)/; if (arr3[mid] > target){
max = mid; //如果数组最中间索引的值大于要查询的目标值,则最大索引设置为中间索引
}
else if (arr3[mid] < target){
min = mid; //如果数组最中间索引的值小于查询的目标值,则最小索引设置为中间索引
}
else{
endTime = clock();
selectCount = i + ;
break;
}
}
printf("折半查询%d值的位置共查询次数%d次,耗时%ld毫秒 \n", target, selectCount, endTime-startTime); //问题3:查询假如把数字1001插入数组中,应该插入到哪个位置,查询到这个位置耗时多久?
//3.1 顺序查询
target = ;
startTime = clock(), endTime = clock();
selectCount = ;
int insertIndex = ; for (int i = ; i < -; i++) {
if (arr3[i] < target && arr3[i+] > target){
endTime = clock();
selectCount = i+;
insertIndex = i;
break;
}
}
printf("按顺序查询%d值应插入位置索引:%d, 共查询次数%d次, 耗时%ld毫秒 \n", target, insertIndex, selectCount, endTime-startTime); startTime = clock(), endTime = clock();
selectCount = ;
insertIndex = ;
//3.2 折半查询
min = ; //最小索引
max = ; //最大索引 for (int i = ; i < ; i++) {
int mid = (min + max)/; if (arr3[mid] > target){
max = mid - ; //如果数组最中间索引的值大于要查询的目标值,则最大索引设置为中间索引-1
}
else if (arr3[mid] < target){
min = mid + ; //如果数组最中间索引的值小于查询的目标值,则最小索引设置为中间索引+1
} if (min > max){
selectCount = i+;
insertIndex = min;
break;
}
}
printf("折半查询%d值应插入位置索引:%d, 共查询次数%d次, 耗时%ld毫秒 \n", target, insertIndex, selectCount, endTime-startTime); //问题4:查询假如把数字18001插入数组中,应该插入到哪个位置,查询到这个位置耗时多久?
//4.1 顺序查询
target = ;
startTime = clock(), endTime = clock();
selectCount = ;
insertIndex = ; for (int i = ; i < -; i++) {
if (arr3[i] < target && arr3[i+] > target){
endTime = clock();
selectCount = i+;
insertIndex = i;
break;
}
}
printf("按顺序查询%d值应插入位置索引:%d, 共查询次数%d次, 耗时%ld毫秒 \n", target, insertIndex, selectCount, endTime-startTime); startTime = clock(), endTime = clock();
selectCount = ;
insertIndex = ;
//4.2 折半查询
min = ; //最小索引
max = ; //最大索引 for (int i = ; i < ; i++) {
int mid = (min + max)/; if (arr3[mid] > target){
max = mid - ; //如果数组最中间索引的值大于要查询的目标值,则最大索引设置为中间索引-1
}
else if (arr3[mid] < target){
min = mid + ; //如果数组最中间索引的值小于查询的目标值,则最小索引设置为中间索引+1
} if (min > max){
selectCount = i+;
insertIndex = max;
break;
}
}
printf("折半查询%d值应插入位置索引:%d, 共查询次数%d次, 耗时%ld毫秒 \n", target, insertIndex, selectCount, endTime-startTime); /** 打印日志(可以比较出来在这种应用场景下,折半查询比按顺序查询效率高):
按顺序查询1000值位置共查询次数501次, 耗时3毫秒
折半查询1000值的位置共查询次数13次,耗时1毫秒
按顺序查询18000值位置共查询次数9001次, 耗时30毫秒
折半查询18000值的位置共查询次数12次,耗时1毫秒
按顺序查询1001值应插入位置索引:500, 共查询次数501次, 耗时2毫秒
折半查询1001值应插入位置索引:501, 共查询次数14次, 耗时0毫秒
按顺序查询18001值应插入位置索引:9000, 共查询次数9001次, 耗时37毫秒
折半查询18001值应插入位置索引:9000, 共查询次数13次, 耗时1毫秒
*/ printf("\n"); return ;
}

四、进制查表(十进制转二进制、八进制、十六进制)

  十进制数据,转成相对应的二进制、八进制、十六进制打印出来

#include <stdio.h>
#include <math.h> void convertToBinary(int num); //十进制转成二进制
void convertToOctonary(int num); //十进制转成八进制
void convertToHexadecimal(int num); //十进制转成十六进制
void convertToOtherType(int num, int moveBitCount); //汇总,包括十进制转二进制、八进制、十六进制 int main(int argc, const char * argv[]) { int a = , b = , c = ;
printf("... 十进制 ...\n");
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c); //测试数字转成二进制
printf("... 十进制转二进制 ...\n");
convertToBinary(a);
convertToBinary(b);
convertToBinary(c); //测试数字转成八进制
printf("... 十进制转八进制 ...\n");
convertToOctonary(a);
convertToOctonary(b);
convertToOctonary(c); //测试数字转成十六进制
printf("... 十进制转十六进制 ...\n");
convertToHexadecimal(a);
convertToHexadecimal(b);
convertToHexadecimal(c); //汇总方法,根据传入的参数把十进制转成对应的二进制、八进制、十六进制
printf("\n");
printf("。。。十进制转二进制222 。。。\n");
convertToOtherType(c, ); printf("。。。 十进制转八进制222。。。\n");
convertToOtherType(c, ); printf("。。。 十进制转十六进制222。。。\n");
convertToOtherType(c, ); /** 打印结果:
... 十进制 ...
28
158
1188
... 十进制转二进制 ...
0000 0000 0000 0000 0000 0000 0001 1100
0000 0000 0000 0000 0000 0000 1001 1110
0000 0000 0000 0000 0000 0100 1010 0100
... 十进制转八进制 ...
34
236
2244
... 十进制转十六进制 ...
1c
9e
4a4 。。。十进制转二进制222 。。。
10010100100
。。。 十进制转八进制222。。。
2244
。。。 十进制转十六进制222。。。
4a4
*/ return ;
} /** 把十进制转成二进制 */
void convertToBinary(int num){
int bitCount = sizeof(num) * ; for (int i = bitCount - ; i >= ; i--) {
printf("%d", num>>i & ); if (i % == ) printf(" ");
}
printf("\n");
} /** 把十进制转成八进制 */
void convertToOctonary(int num){
char chars[] = {'', '', '', '', '', '', '', ''}; //int bitCount = sizeof(num) * 8 / 3; //最多11位
char newCs[] = {''};
int pos = ; while (num > ) {
int result = num & ; //取出3位二进制,转成八进制
newCs[--pos] = chars[result]; //从字符组中找到对应字符存入
num = num>>; //右移3位
} for (int i = pos; i < ; i++) {
printf("%c", newCs[i]);
}
printf("\n");
} /** 把十进制转成十六进制 */
void convertToHexadecimal(int num){
char chars[] = {'', '', '', '', '', '', '', '', '', '', 'a', 'b', 'c', 'd', 'e', 'f'};
//int bitCount = sizeof(num) * 8 / 4; //最多8位
char newCs[] = {''};
int pos = ; while (num > ) {
int result = num & ; //每次取出4位二进制,转成十六进制
newCs[--pos] = chars[result]; //从字符组中找到对应字符存入
num = num>>; //右移4位
} for (int i = pos; i < ; i++) {
printf("%c", newCs[i]);
}
printf("\n");
} /** 根据不同参数把十进制转成对应二进制、八进制、十六进制
参数:num = 要转化的十进制数字
moveBitCount : 每次需要位移的二进制位数量
*/
void convertToOtherType(int num, int moveBitCount){ char chars[] = {'', '', '', '', '', '', '', '', '', '', 'a', 'b', 'c', 'd', 'e', 'f'}; int baseNum = pow(, moveBitCount) - ; //每次按位&的数字,转8进制为7,转16进制为15,转2进制为1 char newCs[] = {''};
int pos = ; while (num > ) {
int result = num & baseNum; //每次取出对应moveBitCount位二进制,转成其他进制
newCs[--pos] = chars[result]; //从字符组中找到对应字符存入
num = num>>moveBitCount; //右移4位
} for (int i = pos; i < ; i++) {
printf("%c", newCs[i]);
}
printf("\n");
}


C语言之冒泡排序、选择排序、折半查询、进制查表的更多相关文章

  1. C语言实现 冒泡排序 选择排序 希尔排序

    // 冒泡排序 // 选择排序 // 希尔排序 // 快速排序 // 递归排序 // 堆排序 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h& ...

  2. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  3. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  4. C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

    C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...

  5. python算法(一)基本知识&冒泡排序&选择排序&插入排序

    本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...

  6. Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)

    Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)

  7. C语言学习之选择排序

    上一篇文章中讲C语言排序中的比较常见的(交换)冒泡排序,那么这篇文章也将以新手个人的经历来讲同样比较常见而实用的数组排序之选择排序. 选择排序,从字面上看是通过选择来进行排序.其实它的用法就是通过选择 ...

  8. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  9. php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序

    <?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){    $num=count($arr);    ...

随机推荐

  1. MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)

    一.单表查询 1.完整的语法顺序(可以不写完整,其次顺序要对) (不分组,且当前表使用聚合函数: 当前表为一组,显示统计结果 ) select distinct [*,查询字段1,查询字段2,表达式, ...

  2. FreeSWITCH异常原因总结

    最经在玩FreeSWITCH的时候,遇到很多的问题,特此总结一下,希望以后不要犯类似的错误了: 1.Client端无法注册,但是FS运行正常? 解决办法:查看防火墙是否关闭./etc/init.d/i ...

  3. 如何在同一台电脑上使用两个github账户(亲测有效)

    1 前言 由于有两个github账号,要在同一台电脑上同步代码,需要给每一个账号添加一个SSH public key,此时推送时git push origin,不知道是哪个账号的远程仓库名称,所以需要 ...

  4. Net 4.5 WebSocket 在 Windows 7, Windows 8 and Server 2012上的比较以及问题

    Net 4.5 WebSocket在Windows 8, Windows 10, Windows Server 2012可以,但是在Windows 7, 就会报错. 错误1.“一个文件正在被访问,当前 ...

  5. jquery easyui datagrid 加每页合计和总合计

    jquery easyui datagrid 加每页合计和总合计 一:效果图 二:代码实现 这个只有从后台来处理 后台根据rows 和page两个参数返回的datatable 命名为dt 然后根据dt ...

  6. Confluence 6 H2 数据库连接与合并整合

    使用 H2 console 连接到你嵌入的 H2 数据库 可以选的,你可以使用 H2 console 来连接到你的 H2 数据库.最简单的访问 Console 的方法是双击 H2 数据库的 jar 文 ...

  7. Confluence 6 数据库 JDBC 驱动

    本页面提供了支持的数据库的所有 JDBC 驱动下载链接. 基于许可证的原因,我们没有将 MySQL 或 Oracle 的数据库驱动整合到 Confluence 中,因此你需要在 Confluence ...

  8. 五.ssh远程管理服务

    01. 远程管理服务知识介绍 1) SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Working Group)制定: ...

  9. laravel 服务提供者

    服务提供者,在laravel里面,其实就是一个工厂类.它最大的作用就是用来进行服务绑定.当我们需要绑定一个或多个服务的时候,可以自定义一个服务提供者,然后把服务绑定的逻辑都放在该类的实现中.在lara ...

  10. java-HTML&javaSkcript&CSS&jQuery&ajax( 八)

    一.JavaScript教程笔记 1.在web页面中一般使用JavaScript脚本语言,支持跨平台,跨浏览器,驱动网页,与用户交互.另外Node.js把JavaScript引入到了服务器端. Jav ...