c14---排序,查找
//
// main.c
// 冒泡排序
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
/*
思路:
1.先分析如何比较
2.找出比较的规律比较完一次之后第二次比较会少一次
3.打印倒三角
4.打印需要比较的角标
5.比较并交换位置
6.将常量替换为变量(length)
*/
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[] = {, , , , , };
int length = sizeof(nums) / sizeof(nums[]);
for (int i = ; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
for (int i = ; i < length - ; i++) {
for (int j = ; j < length - - i; j++) {
// printf("*");
// printf("%i == %i\n", j, j+1);
if (nums[j] > nums[j + ]) {
int temp = nums[j];
nums[j] = nums[j + ];
nums[j + ] = temp;
}
}
// printf("\n");
}
printf("----------\n");
for (int i = ; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
return ;
}
//
// main.c
// 选择-冒泡排序优化
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> void selectSort(int nums[], int length);
void printArray(int nums[], int length);
//void swap(int v1, int v2);
void swap(int nums[], int i, int j);
void bubbleSort(int nums[], int length); int main(int argc, const char * argv[])
{
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[] = {, , , , , , , };
int length = sizeof(nums) / sizeof(nums[]); printArray(nums, length);
// selectSort(nums, length);
bubbleSort(nums, length); printf("----------------\n");
printArray(nums, length); return ;
} // 遍历数组
void printArray(int nums[], int length)
{
for (int i = ; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
} void bubbleSort(int nums[], int length)
{
for (int i = ; i < length - ; i++) {
for (int j = ; j < length - - i; j++) {
if (nums[j] > nums[j + ]) {
swap(nums, j, j+);
}
}
}
} // 选择排序
void selectSort(int nums[], int length)
{
for (int i = ; i < length - ; i++) {
for (int j = i+; j < length; j++) {
if (nums[i] > nums[j]) {
/*
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
*/
// swap(nums[i], nums[j]);
swap(nums, i, j);
}
}
} } // 基本数据类型作为函数的参数, 是值传递, 在函数中修改形参不会影响实参的值
/*
void swap(int v1, int v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
*/
// 交换两个数的值
void swap(int nums[], int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
//
// main.c
// 折半查找
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
#include <time.h> int findKey(int nums[], int key, int length);
int findKey2(int nums[], int length, int key);
int findKey3(int nums[], int length, int key); int main(int argc, const char * argv[]) {
// 现在已知一个有序的数组, 和一个key. 要求从数组中找到key对应的索引的位置
// 对该方法进行封装, 要求找到就返回对应的索引, 找不到就返回-1
int nums[] = {, , , , , [] = };
int key = ;
int length = sizeof(nums) / sizeof(nums[]); // 消耗了多少1181毫秒
clock_t startTime = clock();
int index = findKey(nums, key, length);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index); // 消耗了多少1毫秒
clock_t startTime = clock();
// int index = findKey2(nums, length, key);
// 消耗了多少2毫秒
int index = findKey3(nums, length, key);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index); return ;
} int findKey3(int nums[], int length, int key)
{
int min, max, mid;
min = ;
max = length - ; // 只要还在我们的范围内就需要查找
while (min <= max) {
// 计算中间值
mid = (min + max) / ;
if (key > nums[mid]) {
min = mid + ;
}else if (key < nums[mid])
{
max = mid - ;
}else
{
return mid;
} }
return -;
} int findKey2(int nums[], int length, int key)
{
int min, max, mid;
min = ;
max = length - ;
mid = (min + max) / ; while (key != nums[mid]) {
// 判断如果要找的值, 大于了取出的值, 那么min要改变
if (key > nums[mid]) {
min = mid + ;
// 判断如果要找的值, 小雨了取出的值, 那么max要改变
}else if (key < nums[mid])
{
max = mid - ;
} // 超出范围, 数组中没有需要查找的值
if (min > max) {
return -;
}
// 每次改变完min和max都需要重新计算mid
mid = (min + max) / ;
}
printf("aaaaaa\n"); return mid; } int findKey(int nums[], int key, int length)
{
for (int i = ; i < length; i++) {
if (nums[i] == key) {
printf("%i\n", i);
return i;
}
}
return -;
}
//
// main.c
// 折半查找练习
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int insertValue(int nums[], int length, int key); int main(int argc, const char * argv[]) {
// 现有一个有序的数组, 要求给定一个数字, 将该数字插入到数组中, 还要保证数组是有序的
// 其实就是找到需要插入数字的位置
// 其实这个位置就是min的位置
/*
min = 0
max = 4
mid = 2
*/
// 0 1 2 3 4 5
int nums[] = {, , , ,};
int key = ;
int length = sizeof(nums) / sizeof(nums[]);
printf("需要插入的位置是%i\n", insertValue(nums, length, key)); return ;
} int insertValue(int nums[], int length, int key)
{
int min , max, mid;
min = ;// 1 2
max = length - ;// 4 1
while (min <= max) {
mid = (min + max) / ; // 2 0 1
if (key > nums[mid]) {
min = mid + ;
}else if (key < nums[mid])
{
max = mid - ;
}
}
return min;
}
//
// main.c
// 进制查表法
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
void printfBinary(int value);
void printfBinary2(int value);
void printOct(int value);
void printfHex(int value); void printfHex2(int value);
void printfOct2(int value);
void printfBinary3(int value); int main(int argc, const char * argv[]) {
/*
0000000000000000000000000000
00000000000000000000000000000111
*/
int num = ;// 1010;
// printfBinary2(num);
// printOct(num);
// printfHex2(num);
// printfOct2(num);
printfBinary3(num);
return ;
} void printfBinary3(int value)
{
// 1.定义一个数组, 用于保存二进制中所有的取值
char charValues[] = {'', ''};
// 2.定义一个数组, 用于保存查询后的结果
char results[] = {''};
// 3.定义一个变量, 用于记录当前需要存储到查询结果数组的索引
int pos = ; while (value != ) {
// 1.取出1位的值
int res = value & ;
// 2.利用取出来得值到表中查询对应的结果
char c = charValues[res];
// 3.存储查询的结果
results[--pos] = c;
// 4.移除二进制被取过的1位
value = value >> ;
} // 4.打印结果
for (int i = pos; i < ; i++) {
printf("%c", results[i]);
}
printf("\n"); } void printfOct2(int value)
{
// 1.定义一个数组, 用于保存八进制中所有的取值
char charValues[] = {'', '', '', '', '', '', '', ''};
// 2.定义一个数组, 用于保存查询后的结果
char results[] = {''};
// 3.定义一个变量, 用于记录当前需要存储到查询结果数组的索引
int pos = ;
while (value != ) {
// 1.取出3位的值
int res = value & ;
// 2.利用取出来得值到表中查询对应的结果
char c = charValues[res];
// 3.存储查询的结果
results[--pos] = c;
// 4.移除二进制被取过的三位
value = value >> ;
} // 4.打印结果
for (int i = pos; i < ; i++) {
printf("%c", results[i]);
}
printf("\n"); } void printfHex2(int value)
{
// 1.定义一个数组, 用于保存十六进制中所有的取值
// 规律: 取出的4个二进制位得到的值, 正好是数组中角标对应的值
char charValues[] = {'', '', '', '', '', '', '', '', '', '', 'a', 'b', 'c', 'd', 'e', 'f'};
// '', '', '', '', '', '', '', ''
char results[] = {''};
int pos = ; while (value != ) {
// 取出4位的值
int res = value & ;
// 利用这个值作为索引去数组中查询对应的十六进制的值
char c = charValues[res];
// printf("%c", c);
// 将取出来得值放到用于存储结果数组中
results[--pos] = c; // 每取完一次就干掉它最低的4位
value = value >> ;
// printf("pos = %i\n", pos);
} for (int i = pos; i < ; i++) {
printf("%c", results[i]);
}
printf("\n");
} void printfHex(int value)
{
for (int i = ; i <= ; i++) {
int res = value & ; // 1111
// 对十六进制进行特殊处理
if (res > ) {
// 11 - 10 1 + a
char c = res - + 'a';
printf("%c", c);
}else
{
printf("%i", res);
}
value = value >> ;
}
} void printOct(int value)
{
for (int i = ; i <= ; i++) {
int res = value & ; //
printf("%i", res);
value = value >> ;
}
} void printfBinary2(int value)
{
for (int i = ; i <= ; i++) {
int res = value & ;
printf("%i", res);
value = value >> ;
}
printf("\n");
} void printfBinary(int value)
{
// int offset = sizeof(value) * 8 - 1;
int offset = (sizeof(value) << ) - ;
while (offset >= ) {
int res = (value >> offset) & ;
printf("%i", res);
offset--;
}
printf("\n");
}
//
// main.c
// 进制查表法优化
//
// Created by xiaomage on 15/6/10.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
void total(int value, int base, int offset);
void ptintBinary(int num);
void printfOct(int num);
void printfHex(int num); int main(int argc, const char * argv[]) {
// insert code here...
// ptintBinary(10);
// printfOct(10);
printfHex();
return ;
} void printfHex(int num)
{
total(num, , );
} void printfOct(int num)
{
total(num, , );
} void ptintBinary(int num)
{
total(num, , );
} // 转换所有的进制
// value就是需要转换的数值
// base就是需要&上的数
// offset就是需要右移的位数
void total(int value, int base, int offset)
{
// 1.定义一个数组, 用于保存十六进制中所有的取值
char charValues[] = {'', '', '', '', '', '', '', '', '', '', 'a', 'b', 'c', 'd', 'e', 'f'};
// 2.定义一个数组, 用于保存查询后的结果
char results[] = {''};
// 3.定义一个变量, 用于记录当前需要存储到查询结果数组的索引
int pos = sizeof(results)/ sizeof(results[]); while (value != ) {
// 1.取出1位的值
int res = value & base;// 1 7 15
// 2.利用取出来得值到表中查询对应的结果
char c = charValues[res];
// 3.存储查询的结果
results[--pos] = c;
// 4.移除二进制被取过的1位
value = value >> offset;// 1 3 4
} // 4.打印结果
for (int i = pos; i < ; i++) {
printf("%c", results[i]);
}
printf("\n"); }
c14---排序,查找的更多相关文章
- Sublime文本排序&查找重复行&删除重复行
排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- 猪八戒吃西瓜(wmelon)-排序-查找
问题 A: 猪八戒吃西瓜(wmelon) 时间限制: 1 Sec 内存限制: 64 MB提交: 30 解决: 14[提交][状态][讨论版] 题目描述 有一天,贪吃的猪八戒来到了一个大果园,果园里 ...
- C/C++ 排序&&查找算法(面试)
一.排序 1.冒泡排序 void BubbleSort(int array[],int n) { ; ; ; ; ;i<n - ;i++) /*外循环控制排序的总趟数*/ { flag = ; ...
- javascript排序 查找算法大全
在pptv的实习结束了, 忙着找工作的事,顺便把数据结构的那本书重新复习了一遍.为了加深印象,特意把里面的常用的排序.查找算法用js写了一遍 具体的实例在我的github上,大家可以访问的: http ...
- 深入JDK源码之Arrays类中的排序查找算法(转)
原文出处: 陶邦仁 binarySearch()方法 二分法查找算法,算法思想:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的. 基本思想:假设数据是按升序排序的,对于给定值x,从序列 ...
- [Day7]循环、数组方法、排序查找
1. ASCII(American Standard Code for Information Interchange) (1)数字0-9对应ASCII编码十进制为48-57, 字母a-z对应ASCI ...
- Java常用的排序查找算法
public static void main(String[] args) { // bubbleSort(); // int[] a = {20,2,10,8,12,17,4,25,11 ...
- python排序查找
无序表查找 def seq_search(lst, key): found = False pos = 0 while pos < len(lst) and not found: if lst[ ...
- mysql 实现经纬度排序查找功能
需求如下: 商品有多个门店,用户使用App时需要查找附近门店的商品,商品要进行去重分页. 思路: 1.确认mysql自带经纬度查询函数可以使用. 2.该需求需要利用分组排序,取每个商品最近门店的商品i ...
随机推荐
- Android 应用安装成功之后删除apk文件
问题: 在应用开发中遇到需要这样的需求:在用户下载我们的应用安装之后删除安装包. 解决: android会在每个外界操作APK的动作之后发出系统级别的广播,过滤器名称: android.intent. ...
- 阿里巴巴矢量库IconFont__使用小录
使用阿里巴巴矢量库方法虽然不难,但本人记性不好,遂在次记录几笔 阿里巴巴矢量库地址:http://www.iconfont.cn/plus 阿里巴巴矢量库图标好处: 1:图标矢量化 2:自己总结:ic ...
- 【sqli-labs】 less9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
加and http://localhost/sqli/Less-9/?id=1' and '1'='1%23 http://localhost/sqli/Less-9/?id=1' and '1'=' ...
- Mysql分组求和&LIMIT
分组求和mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY na ...
- 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图
1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...
- CentOS6.9下NFS配置说明
NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...
- Django F查询Q查询Only与Defel
F/Q查询 测试表 from django.db import models # Create your models here. class MyCharField(models.Field): d ...
- eas之单据转换规则
/** * BOTP单据转换 * @param botpNum 转换规则编号 * @param BillInfo 原单据 */ public static void BOTP(String b ...
- codeforces 427D Match & Catch(后缀数组,字符串)
题目 参考:http://blog.csdn.net/xiefubao/article/details/24934617 题意:给两个字符串,求一个最短的子串.使得这个子串在两个字符串中出现的次数都等 ...
- [置顶]
tcpflow 抓包
转自: http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/ tcpflow 抓包 Apr 16, 2015 大家都知道 t ...