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 ...
随机推荐
- 闲暇时光里最好的挖矿体验——CPU挖乌龟币
我之前其实是不玩加密货币的,主要是没有钱取投资(tou ji),也没有钱去投资矿机. 不过前几天CSDN推送了一个短文,<黑客用GitHub服务器挖矿,三天跑了3万个任务,代码惊现中文> ...
- 测试报告模板:HTMLTestRunner.py(新版)
报告样式效果: 报告源码:HTMLTestRunner.py 1 """ 2 A TestRunner for use with the Python unit test ...
- SpringMVC笔记(五)
1. 拦截器 1.1 拦截器和过滤器 SpringMVC的处理器拦截器类似于Servlet开发过程中的过滤器Filter,用于对处理器进行预处理和后处理.我们可以自定义一些拦截器来实现特定的功能 过滤 ...
- 032- for循环语句
问题 请在控制台里面打印10次HelloWorld. 这时可能你会这么写: System.out.println("helloworld"); System.out.println ...
- 多指灵巧手MoveIt!与Gazebo联合仿真框架搭建
至于为什么叫框架,一是因为灵巧手的3维模型没有按照基本的设计要求画,正常来说,设计机器人机构之前应该设计好机构需要多少个自由度/DOF,每个自由度是旋转/revolute类型还是滑移/prismati ...
- vue route 跳转
index.js { path: '/grouporder/grouporderdetail/id/:id', name: '/grouporder/grouporderdetail/id/', co ...
- display:table-cell,inline-block 之间的缝隙
1.dispaly:table-call ,会让你对元素设置的为百分百的宽度失效,设置正常数值宽高时, vertical-align: middle;可让内部元素垂直居中,但如果加上position: ...
- Python2中的urllib、urllib2和 Python3中的urllib、requests
目录 Python2.x中 urllib和urllib2 常用方法和类 Python3.x中 urllib requests Python2.x中 urllib和urllib2 urllib 和 ur ...
- C#-WiFi共享
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- sqlyog报错2058
报错描述 SQLyog连接mysql8.0时,SQLyog Ultimate显示报错信息并附带乱码 "错误号码2058,Plugin caching--sha2_passward could ...