C语言练习题1(关于快速排序,二分查找与运行时间)
刚刚完成师兄给的一道题目:
随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数), 结果输出查询的时间,以及是否查到
分享下自己的解题思路:
1,要懂得如何随机生成数
2,要了解快速排序以及二分法思想
3,要直到如何测试出程序运行时间
下面是自己写的代码,欢迎各位提出宝贵的意见以及见解,小生感激不尽
1 /*
2 本代码描述:
3
4 随机生成10000位数,进行快速排序后,
5 用二分查找法定位到某个要查询的数
6 (键盘输入某个要查询的数),
7 结果输出查询的时间,以及是否查到
8
9 */
10 #define N 10000
11 #include<stdio.h>
12 #include<stdlib.h>
13 #include<time.h> //因为后面要用到time()函数来返回当前时间来做随机数种子
14
15 //这个快速排序的其中一个返回轴值的函数
16 int Partition(int a[],int first,int end)
17 {
18 int i;
19 int j;
20 int temp;
21 i = first , j = end; /*默认轴值位a[0],即最左侧的a[i]*/
22
23 while(i<j) /* 当i不等于j时此次循环一直执行下去*/
24 {
25 while(i<j && a[i]<=a[j]) /*先从右侧往左侧开始扫描*/
26 {
27 j--; /* 直到右侧j值不大于左侧的i值*/
28 }
29 if(i<j)
30 {
31 temp = a[i];
32 a[i] = a[j];
33 a[j] = temp;
34 i++; /*交换位置后另外一方的坐标值自增1*/
35 }
36
37 while(i<j && a[i] <= a[j]) /*从左侧开始往右侧扫描*/
38 {
39 i++;
40 }
41 if(i<j)
42 {
43 temp = a[i];
44 a[i] = a[j];
45 a[j] = temp;
46 j--;
47 }
48 }
49 return i ; /*直到i==j,返回本次轴值*/
50 }
51
52
53 //这个快速排序的其中一个拆分的函数
54 void QuickSort(int a[],int first,int end)
55 {
56 int pivot; //记录轴值
57 if(first<end)
58 {
59 pivot = Partition(a,first,end);
60 QuickSort(a,first,pivot-1);
61 QuickSort(a,pivot+1,end);
62 }
63 }
64
65 //二分法
66 int Search(int a[],int target,int low,int high) //传入a[]升序数组与要查找的目标target和数组的首末位置
67 {
68 int middle;
69
70 middle = (low+high)/2; //初始化结束
71
72 while( high >= low) //二分查找现在开始,奏国歌,升国旗,敬礼
73 {
74
75
76 if(target > a[middle])
77 {
78 low = middle +1;
79 // middle = (low+high)/2; 此代码会影响下面的a[middle]的判断 所以出错
80 }
81 else if(target < a[middle])
82 {
83 high = middle - 1;
84 // middle = (low+high)/2; 删除此行以及上面一行代码。
85 }
86 else //此处else为 target == a[middle]
87 {
88 return (middle + 1); //此处时关键,找到目标跳出循环并返回目标i
89 }
90 middle = (high + low) /2;
91 }
92 return -1; //-1为没有找到目标值
93 }
94
95
96 void main()
97 {
98 int a[N] = {0};
99 int i = 0;
100 int k,target;
101 clock_t begin,end;
102 srand((time(NULL))); //以系统时间为随机种子
103
104
105 begin = clock();
106 for(i = 0;i < N ;i++) //随机赋值为数组a[10000]来了
107 {
108 a[i] = rand();
109 }
110 end = clock();
111 printf("随机数赋值所用时间为:%f s\n",(double)(end - begin)/CLOCKS_PER_SEC);
112 printf("\n");
113
114 begin = clock(); //快速排序
115 QuickSort(a,0,N-1);
116 end = clock();
117 printf("快速排序所用的时间为:%f s\n",(double)(end - begin)/CLOCKS_PER_SEC);
118 printf("\n");
119
120 printf("排序后的第1234位为%d:\n\n",a[1233]); //以第1233位为检测点
121
122
123 printf("第1230到1240位数字为:\n");
124 for(i=1229;i<1240;i++)
125 printf("%d ",a[i]);
126 printf("\n");
127
128 printf("\n");
129 printf("输入所要查询的数:");
130 scanf("%d",&target);
131
132 begin = clock(); //二分法查找所需目标
133 k = Search(a,target,0,N-1);
134 if(k!=-1)
135 {
136 printf("%d已经找到,在第%d位\n",target,k);
137 }
138 else
139 {
140 printf("很遗憾没有找到!");
141 }
142 end = clock();
143 printf("本次查询%d所用的时间:%f s\n",target,(double)(end - begin)/CLOCKS_PER_SEC);
144 printf("\n");
145
146
147
148 system("pause");
149
150 }
C语言练习题1(关于快速排序,二分查找与运行时间)的更多相关文章
- 常用算法1 - 快速排序 & 二分查找
1. 二分查找法: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1. 二分查找法要求数据为一组有序的序列(大到小 ...
- C# 快速排序--二分查找法--拉格朗日插值法
1.快速排序 参考自: https://www.cnblogs.com/yundan/p/4022056.html namespace 快速排序算法 { class Program { static ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- C语言程序设计:二分查找(折半查找)
目录 C语言程序设计:二分查找(折半查找) 1.什么是二分查找 2.二分查找的优点 3.二分查找的缺点 4.二分查找原理 5.源代码实现 6.后话 C语言程序设计:二分查找(折半查找) 1.什么是二分 ...
- golang 快速排序及二分查找
二分查找 func main() { arr := []int{0, 1, 2, 3, 4, 5, 6} fmt.Println(BinarySearch(arr, 5)) } func Binary ...
- 数据结构之二分查找——Java语言实现
场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置. 首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明 ...
- C语言查找算法之顺序查找、二分查找(折半查找)
C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...
- C语言二分查找法
参考了C语言中折半查找法(二分法)的实现 二分查找算法(C语言实现) 先附上代码 #include<stdio.h> int BinSearch(int arr[],int len,int ...
- C语言实现 二分查找数组中的Key值(递归和非递归)
基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...
随机推荐
- 6.3string用法
string类型可以大大方便对字符串的处理 1.string的定义 string str; string str="abcd"; 2.string中内容的访问 (1)可以像字符数组 ...
- 1. HTML <fieldset> 标签
定义和用法 fieldset 元素可将表单内的相关元素分组. <fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fieldset> ...
- MySQL学习之路(一)锁机制
1 锁的分类 1.1 操作类型 读锁(共享锁):针对同一份数据,多个操作可以同时进行而不会互相影响 写锁(排它锁):当写操作没有完成前,它会阻塞其他读锁或者写锁 1.2 操作粒度 表锁:锁住整张表 行 ...
- 哈工大LTP进阶使用-三元组事件抽取
哈工大LTP基本使用-分词.词性标注.依存句法分析.命名实体识别.角色标注 上一节我们讲了LTP的基本使用,接下来我们使用其进行事件抽取. 参考代码:https://github.com/liuhua ...
- JMeter 结果处理常见问题
1. 前言 2. 结果处理常见问题 1)在察看结果树中只看失败情况 2)如何把日志放入文件查看 3)cvs 文件中文读取乱码 4)失败请求数据的采集 5)结果树响应数据中文乱码解决办法 1. 前言 工 ...
- Java变量详解(变量定于及语法创建)
变量的使用定义 变量用于操作系统中,实体之间的传递,把变量看作一个在内存空间中声明的存储位置,在调用变量的时候,系统会自动的调用内存中的存储位置. 在Java中,变量又称为字段,故字段在Java中又有 ...
- 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现
上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...
- 病毒木马查杀实战第024篇:MBR病毒之编程解析引导区
前言 通过之前的学习,相信大家已经对磁盘的引导区有了充分的认识.但是我们之前的学习都是利用现成的工具来对引导区进行解析的,而对于一名反病毒工程师而言,不单单需要有扎实的逆向分析功底,同时也需要有很强的 ...
- hdu4561 连续最大积
题意: 连续最大积 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- Windows PE 第一章开发环境和基本工具使用
第一章 Windows PE 基本工具 1.1开发语言MASM32 1.1.1设置开发环境 这个不细说了,我在整理Intel汇编的时候详细的说了环境搭建以及细节.地址是:http://blog.csd ...