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 }

  

时间: 2024-10-24 11:16:49

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

选择排序、冒泡排序、快速排序和二分查找的C语言实现

1 #include <stdio.h> 2 3 #define ASC 0 //升序,从左到右,从小到大 4 #define DESC 1 //降序,从左到右,从大到小 5 #define TRUE 1 //布尔值,真 6 #define FALSE 0 //布尔值,假 7 8 typedef int datatype; //定义数组元素的类型,这里暂定为int 9 10 void selectSort(datatype array_to_sort[], int length, int mo

编程算法 - 快速排序(QuickSort)和二分查找(BinarySearch)

快速排序(QuickSort)和二分查找(BinarySearch) 本文地址: http://blog.csdn.net/caroline_wendy 快速排序和二分查找的定义, 网上书上都有, 本文主要是讲解如何写出这两个经典算法. 程序员必须掌握的两种算法, 使用任何语言, 使用纸都是必须的. 快速排序(C): /* * main.cpp * * Created on: 2014年9月10日 * Author: Spike */ #include <stdio.h> #include &

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

学习快速排序和二分查找算法

1. 快速排序的思想采用的是分治算法实现,从头选择一个元素是作为"哨兵元素",然后从尾部开始寻找一个比"哨兵元素"小的元素,然后跟它交换,接着从头开始寻找比"哨兵元素"大的:元素,然后交换,直到"哨兵元素"的左边都"哨兵元素"小,右边都比"哨兵元素"大为止,这算是一次划分,快速排序是要经过的 k-1趟(假设有k个元素)划分才能排序好所有的元素. 下面根据分治实现的java代码: publ

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆) 虽然直接插入排序,冒泡排序以及二分查找是算法中最为基础以及老掉牙的话题,但作为一名算法的深爱者,有时候无聊时候总会将这些简单的话题重新理解并敲写一番,目的只是为了得到理解娴熟的程度.而且,我觉得越是简单基础的东西,有时候更应该反复的去敲写,深化它,并最终让其中的思想内化为自己的一部分.待到他日一提起之时,会相当娴熟的"刷刷刷..."几分钟搞定,那就很有成就感了! 因为我喜欢对于一个问题进行实例的剖析,进而再转化为特有的用某种

顺序表的增删查改、二分查找、冒泡和快速排序

SeqList 声明文件 #pragma once #define MAX_SIZE 5 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; void PrintSeqList(SeqList* pSeq); void InitSeqList(SeqList* pSeq);//初始化 void PushBack(SeqList* pSeq, DataType

JS冒泡排序,快速排序,二分查找

//冒泡排序 思想:一个数组双层循环,判断左右相邻的两个数值,大的在右小的在左,如果左的比右的大,双方替换位置 之所以要数组的长度减一,是因为数组是从0开始的,比如说一个数组有7个元素,它的长度为7,分别为a[0],a[1],a[2],a[3]a[4],a[5],a[6]这7个所以当你要取数组中最后一个a[6]时是需要用长度减1的而为什么要减i呢,则是因为你的冒泡排序是把最大的放到最后一位,比如第一次循环的时候进行排序完,最后一位是最大的了,根本没有必要在第二次循环当中把他在拿去比大小了吧,并且

二分查找与快速排序算法

1 /**********二分查找*****************/ 2 int half_find(int *num,int size, int a) 3 { 4 int i=0; 5 int low=0; 6 int high=size-1; 7 int mid;//记录中间位置 8 while(low<=high) 9 { 10 mid = (low+high)/2; 11 if(num[mid] == a) 12 return mid;//返回所在位置 13 if(num[mid] >

快速排序和二分查找

快排和二分查找都基于一种叫做「分治」的算法思想,通过对数据进行分类处理,不断降低数量级,实现O(logN)(对数级别,比O(n)这种线性复杂度更低的一种,快排核心是二分法的O(logN),实际复杂度为O(N*logN))的复杂度. 快速排序 快排大概的流程是: 随机选择数组中的一个数 A,以这个数为基准 其他数字跟这个数进行比较,比这个数小的放在其左边,大的放到其右边 经过一次循环之后,A 左边为小于 A 的,右边为大于 A 的 这时候将左边和右边的数再递归上面的过程 const Arr = [