C语言练习题1(关于快速排序,二分查找与运行时间…
2018-06-18 04:05:18来源:未知 阅读 ()
刚刚完成师兄给的一道题目:
随机生成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 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C语言程序结构 2020-05-31
- 关于使用ffmpeg的一些牢骚 2020-05-08
- 每日干货丨C++语言主流开发工具推荐! 2020-04-28
- C语言实现经典游戏——扫雷! 2020-04-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash