刚刚完成师兄给的一道题目:  

  随机生成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. 二分查找法: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1. 二分查找法要求数据为一组有序的序列(大到小 ...

  2. C# 快速排序--二分查找法--拉格朗日插值法

    1.快速排序  参考自: https://www.cnblogs.com/yundan/p/4022056.html namespace 快速排序算法 { class Program { static ...

  3. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  4. C语言程序设计:二分查找(折半查找)

    目录 C语言程序设计:二分查找(折半查找) 1.什么是二分查找 2.二分查找的优点 3.二分查找的缺点 4.二分查找原理 5.源代码实现 6.后话 C语言程序设计:二分查找(折半查找) 1.什么是二分 ...

  5. golang 快速排序及二分查找

    二分查找 func main() { arr := []int{0, 1, 2, 3, 4, 5, 6} fmt.Println(BinarySearch(arr, 5)) } func Binary ...

  6. 数据结构之二分查找——Java语言实现

    场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置. 首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明 ...

  7. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  8. C语言二分查找法

    参考了C语言中折半查找法(二分法)的实现 二分查找算法(C语言实现) 先附上代码 #include<stdio.h> int BinSearch(int arr[],int len,int ...

  9. C语言实现 二分查找数组中的Key值(递归和非递归)

    基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...

随机推荐

  1. 【深度学习】PyTorch CUDA环境配置及安装

    Pytorch版本介绍 torch:1.6 CUDA:10.2 cuDNN:8.1.0 安装 NVIDIA 显卡驱动程序 一般 电脑出厂/装完系统 会自动安装显卡驱动 如果有 可直接进行下一步 下载链 ...

  2. 2.EL表达式&JSTL标签库常用方法

    1.EL表达式 Expression Language表达式语言,主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出. 格式为${表达式} EL表达式输出Bean的普通属性.数组属性.Li ...

  3. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之文件配置-08

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之文件配置-08 欢迎加QQ群:1026880196   进行交流学习 文件配置 #controller ...

  4. GO-02-helloworld

    package main /** package main表示一个可独立执行的程序,每个Go应用程序都需要包含一个名为main的包, 并且该包包含一个叫main()的函数(该函数是Go可执行程序的执行 ...

  5. matlab通用命令

    常用命令 命令 命令说明 cd 显示或改变当前文件夹 dir 显示当前文件夹或指定目录下的文件 clc 清除工作窗中的所有显示内容 home 将光标移至命令行窗口的最左上角 clf 清除图形窗口 ty ...

  6. 实战项目部署应用到kubernetes流程(jenkins+docker+k8s)

    说明 通过jenkins构建java应用程序发布到k8s集群中 本文已一个大数据的java项目来演示构建部署过程 支持发布和回滚 支持一套模板应用不同项目 k8s基础准备 创建项目名称空间 [root ...

  7. Django模板引擎

    Django作为Web框架,需要一种很便利的方法动态地生成 HTML 网页,因此有了模板这个概念.模板包含所需 HTML 的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTM ...

  8. 1149 Dangerous Goods Packaging

    When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...

  9. hdu3472 混合欧拉

    题意:       给你一些字符串,有的字符串反过来也有意义,题目问给的这n个字符串是否可以首尾相连,组成一个串. 思路:       算是混合欧拉的基础题目了,混合欧拉就是专门处理这类问题的,先说下 ...

  10. 使用BurpSuite抓取HTTPS网站的数据包

    昨天面试,技术官问到了我如何使用BurpSuite抓取https网站的数据包,一时间没能回答上来(尴尬!).因为以前https网站的数据包我都是用Fiddler抓取的,Fiddlert自动帮我们配置好 ...