C语言练习题1(关于快速排序,二分查找与运行时间…

2018-06-18 04:05:18来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

  随机生成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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:1095 火星人

下一篇:sizeof(char**),sizeof(char*), sizeof(char)小注