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

  随机生成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. 「HTML+CSS」--自定义加载动画【017】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  2. matlab数值类型

    matlab数值类型 数值类型的分类 整数类型    整数类型有8种.上面的数字为其内存大小,如:int8,整数所占内存大小为8个字节.除了int64 和 uint64不能进行数值运算之外都可以. 类 ...

  3. centos7 中静态IP地址的配置

    虚拟机中也可以像Windows系统那样从浏览器上下载文件,但在这之前,要必须保证虚拟机网络服务通畅.而配置网络服务其实就是在编辑网卡配置文件,具体步骤如下: 网卡配置文件位置:/etc/sysconf ...

  4. postgresql高级应用之行转列&汇总求和

    postgresql高级应用之行转列&汇总求和 轉載請注名出處 https://www.cnblogs.com/funnyzpc/p/14732165.html 前言 节前公司业务方需要做一個 ...

  5. 2- 计算机的组成以及VMware使用

    计算机的组成: 硬件: 处理器(CPU):I3 I5 I7 运行内存RAM(存储数据) 容量(字节为单位) 主板(总线设备) 输入输出设备(显示屏,键盘,鼠标,触目屏) 外部存储设备(硬盘,U盘,TF ...

  6. SpringCloud-Stream消息通信

    SpringCloud微服务实战系列教程 Spring Cloud Stream 消息驱动组件帮助我们更快速,更⽅便,更友好的去构建消息驱动微服务的.当时定时任务和消息驱动的⼀个对⽐.(消息驱动:基于 ...

  7. Windows之磁盘管理

    0x01 磁盘管理概述 ​ 磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,他们位于计算机管理控制台中,它包括查错程序和磁盘碎片整理程序以及磁盘整理程序.(来源百度 ...

  8. C/C++ 进程代码注入与提权/降权

    如果将shellcode注入到具有特定权限的进程中,我们就可以获得与该进程相同的权限,此方法可以用于提权与降权操作,注入有多种方式,最简单的是直接将metasploit生成的有效载荷直接注入到目标进程 ...

  9. 获取全局描述符表GDT的内容

    /stdfx.h文件 //Ring0环的程序 //测试环境VS2005 #ifndef _WIN32_WINNT // Allow use of features specific to Window ...

  10. 【python】Leetcode每日一题-旋转链表

    [python]Leetcode每日一题-旋转链表 [题目描述] 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例1: 输入:head = [1,2,3,4,5] ...