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 ...
随机推荐
- C语言-字符串函数的实现(五)之strstr
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- 4. Linux-startx命令
Linux系统startx命令的功能和使用方法 Linux系统命令startx的功能很简单,就是启动X Window的服务这一项,没有其他的了.其实startx命令启动的是xinit,然后再由xini ...
- linux gcc命令参数
gcc命令参数笔记 1. gcc -E source_file.c -E,只执行到预处理.直接输出预处理结果. 2. gcc -S source_file.c -S,只执行到汇编,输出汇编代码. 3. ...
- 【.NET 与树莓派】数模转换
在开始之前,需要说明一对很耳熟的概念--数字信号 & 模拟信号. 这些概念的理论有些复杂,你如果相当有兴趣,可以找来有关的文献细细研究:若你不关心那是啥只想知道咋用,那就通俗但不庸俗地理解一下 ...
- 学就完事了!万星项目带你做 3D 游戏——GitHub 热点速览 v.21.18
本文首发于「HelloGitHub」微信公众号,搜索「HelloGitHub」点击关注解锁更多宝藏! 作者:HelloGitHub-小鱼干 新手开始学习的时候,都会遇到一个问题:如何开始学 xx?Se ...
- 路由器逆向分析------QEMU的下载和安装(Linux平台)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68953160 一.QEMU源码的下载和编译 QEMU源码的github下载地址:h ...
- Average Score39届亚洲赛牡丹江站A题
题意: A班有n个人,B班有m个人,然后现在给你n-1个A班人的成绩,和m个B班人的成绩,然后题目要求求出A班剩下的没给成绩那个人的成绩范围,要求是这个人从A班转到B班后能使A,B的平均分 ...
- DVWA之Brute Force(暴力破解)
目录 Low Medium High Impossible 暴力破解是指使用穷举法,举出所有的可能的结果,然后逐一验证是否正确! Low 源代码: <?php if( isset( $_GET[ ...
- WIN64内核编程-的基础知识
WIN64内核编程基础班(作者:胡文亮) https://www.dbgpro.com/x64driver 我们先从一份"简历"说起: 姓名:X86或80x86 性别:? 出生 ...
- Swift系列一 - 数据类型
如果你习惯了OC的语法,第一次接触Swift的语法可能会有点抗拒,因为Swift的语法有点怪.但如果你有前端的基础,学Swift可能会有点吃力,如果你有C++的基础可能会学得比较快点.不管你有什么样的 ...