数据结构 排序和查找

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int ITEMNUM = 100;

#define ElemType int

//冒泡排序
void Bubblesort(ElemType R[],int n,int &comp_num,int &move_num)
{
 int i,j,flag=1;     //当flag为0,则停止排序
 ElemType temp;
 for(i = 0;i < n-1;i++){                      //i表示趟数,最多n-1趟
  flag = 0;
  for(j = 1;j < n-i;j++){      //表示每趟比较次数n-i-1
   comp_num++;
   if(R[j] < R[j-1]){         //发生逆序
    temp = R[j];
    R[j] = R[j-1];
    R[j-1] = temp;    //交换
    move_num += 3;
    flag = 1; //标记发生了交换
   }
  }
  if(flag == 0) break;
 }
}

//快速排序
void quicksort(ElemType R[],int left,int right,int &comp_num,int &move_num)         //快速排序
{
 int i = left,j = right;
 ElemType temp = R[i];
 while(i<j){
  while((R[j]>temp)&&(i<j))
  {
   j--;
   comp_num++;
  }
  comp_num++;

  if(i < j){
   R[i++] = R[j];
   move_num++;
  }

  while((R[i] < temp)&&(i<j)){
   i++;
   comp_num++;
  }

  if(i<j){
   R[j--] = R[i];
   move_num++;
  }
 }

 //一次划分得到基准值的正确位置
 R[i] = temp;
 move_num++;
 if(left < i-1)
  quicksort(R,left,i-1,comp_num,move_num);             //递归调用左子区间
 if(i+1 < right)
  quicksort(R,i+1,right,comp_num,move_num);             //递归调用右子区间

}

//归并排序
void merge(ElemType R[],ElemType A[],int s,int m,int t,int &comp_num,int &move_num)
 //对两个子区间R[s]~R[m]和R[m+1]~R[t]合并,结果存入A中
{
 int i,j,k;
 i = s;j = m+1;k = s;
 while((i<=m)&&(j<=t))
 {
  comp_num++;

  if(R[i] <= R[j]){
   A[k] = R[i];i++;k++;
   move_num++;
  }else{
   A[k] = R[j];j++;k++;
   move_num++;
  }
 }
 while(i <= m){                  //复制第一个区间中剩下的元素
  A[k] = R[i];i++;k++;
  move_num++;
 }
 while(j <= t){          //复制第二个区间中剩下的元素
  A[k] = R[j];j++;k++;
  move_num++;
 }
}

//希尔排序
void ShellSort(ElemType R[],int n,int &comp_num,int &move_num)
{
 int i,j,d,k;
 ElemType temp;
 d=n/2;   //d取初值n/2
 while (d>0)
 {
  comp_num++;
  for (i=d;i<n;i++)
  {
   j=i-d;
   while(j>=0&&R[j]>R[j+d])
   {
    temp=R[j];
    R[j]=R[j+d];
    R[j+d]=temp;
    j=j-d;
    move_num++;
   } 
  }
  printf("    d=%d:   ",d);//输出每一趟排序的结果
  for (k=0;k<n;k++)
  {
   printf("%3d",R[k]);
  }
  printf("\n");
  d=d/2;             //递减增量d
     }
}

void mergepass(ElemType R[],ElemType A[],int n,int c,int &comp_num,int &move_num)
 //对R数组做一趟归并,结果存入A数组中,n为元素个数,c为区间长度
{
 int i,j;
 i = 0;
 while(i+2*c-1 <= n-1){          //长度均为c的两个区间合并成一个区间
  merge(R,A,i,i+c-1,i+2*c-1,comp_num,move_num);
  i += 2*c;
 }
 if(i+c-1 < n)   //长度不等的两个区间合并成一个区间
  merge(R,A,i,i+c-1,n-1,comp_num,move_num);
 else{
  for(j = i;j <= n-1;j++)         //仅剩一个区间时,直接复制到A中
  {
   A[j] = R[j];
   move_num++;
  }
 }
}

 

void mergesort(ElemType R[],int n,int &comp_num,int &move_num)
{
 int c = 1;
 ElemType A[ITEMNUM];

 while(c < n){
  mergepass(R,A,n,c,comp_num,move_num);  //一次合并,结果存入A中
  c*=2;  //区间长度扩大一倍
  mergepass(A,R,n,c,comp_num,move_num);   //再次合并,结果存入R中
  c*=2;
 }
}

 

void print(ElemType R[],int n)
{
 for(int i = 0;i <= n-1;i++){
  if(i%10 == 0){
   printf("\n");
  }
  printf("%6d",R[i]);
 }
 printf("\n");
}

 

 

void producerandom(ElemType T[ITEMNUM])
{
 time_t t;
 srand(time(&t));   //time()返回从某点开始到现在的秒数,返回值与t的值一样
 for(int i=0;i <= ITEMNUM;i++)
  T[i] =rand()%1000;                 //产生的随机数
 print(T,ITEMNUM);                      //输出随机数
}

//折半查找
int BinSearch(ElemType R[],ElemType k)  
{
 int low = 0,high =ITEMNUM-1,mid;
 while(low <= high){
  mid =(low + high)/2;
  if(R[mid] == k)      //查找成功返回
   return mid;
  if(R[mid] > k)  //继续在R[low..mid-1]中查找
   high = mid-1;
  else
   low = mid+1;  //继续在R[mid+1..high]中找
 }
 return -1;
}

void clear()      //自动清屏
{
 system("pause");
 system("cls");
}
void showmenu()
{
 printf("\n\n");
 printf("            ------排序与查找------            \n");
 printf("**********************************************\n");
 printf("*           1------ 产生随机数               *\n");
 printf("*           2------冒泡排序                  *\n");
 printf("*           3------快速排序                  *\n");
 printf("*           4------归并排序                  *\n");
 printf("*           5------希尔排序                  *\n");
 printf("*           6------查找                      *\n");
 printf("*                                            *\n");
 printf("*           0------退出                      *\n");
 printf("**********************************************\n");
 printf("请选择菜单号(0--6):");
}

void Sort_Search()
{
 ElemType R[ITEMNUM],T[ITEMNUM];
 int comp_num,move_num;            //比较和移动次数
 int i;
 char choice = 'N';

 int randfl = 0;   //随机数产生标志,0无,1有
 int sorted = 0;      //已排序标志

 while(choice != '0'){
  showmenu();
  flushall();
  scanf("%c",&choice);
  switch(choice){
  case '1':
   printf("\n\t产生随机数.......\n");
   producerandom(T);
   randfl = 1;  //随机数已产生
   sorted = 0;   //未排序
   //clear();
   break;
  case '2':
   if(randfl == 0){
    printf("\n\t请产生随机数\n");
   }else{
    printf("\n\t冒泡排序\n");
    comp_num = 0; move_num = 0;
    for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
    Bubblesort(R,ITEMNUM,comp_num,move_num);
    print(R,ITEMNUM);
    printf("\t 数据比较次数:%d\t,数据移动次数:%d\t\n",comp_num,move_num);
    sorted = 1;                             //已排序
   }
   //clear();
   break;
  case '3':
   if(randfl == 0){
    printf("\n\t  请先产生随机数\n");
   }else{
    printf("\n\t快速排序\n");
    comp_num = 0;move_num = 0;
    for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
    quicksort(R,0,ITEMNUM-1,comp_num,move_num);
    print(R,ITEMNUM);
    printf("\t数据比较次数为:%d\t,数据移动次数为:%d\n",comp_num,move_num);
    sorted = 1;

   }
   //clear();
   break;
  case '4':
   if(randfl == 0){
    printf("\n\t请产生随机数\n");
   }else{
    printf("\n\t归并排序\n");
    comp_num = 0;move_num = 0;
    for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
    mergesort(R,ITEMNUM,comp_num,move_num);
    print(R,ITEMNUM);
    printf("\t数据比较次数为:%d\t,数据移动次数为:%d\n",comp_num,move_num);
    sorted = 1;
   }
   //clear();
   break;
  case'5':
   if(randfl == 0)
   {
    printf("\n\t请产生随机数\n");
   }
   else
   {
    printf("\n\t希尔排序\n");
    comp_num = 0;move_num = 0;
    for(i = 0;i < ITEMNUM;i++) R[i] = T[i];
    mergesort(R,ITEMNUM,comp_num,move_num);
    print(R,ITEMNUM);
    printf("\t数据比较次数为:%d\t,数据移动次数为:%d\n",comp_num,move_num);
    sorted=1;
   }
   break;
  case '6':
   if(sorted == 0){
    printf("\n\t随机数还没排序呢!\n");
   }else{
    printf("\n\t折半查找\n");
    printf("\n\t请输入要查找的元素:");
    ElemType key;
    int sit;
    scanf("%d",&key);
    sit = BinSearch(R,key);
    if(sit != -1){
     printf("\t\t找到该元素,它的位序是:%d\n",sit+1);
    }else{
     printf("\t\t查找失败\n");
    }
   }
   //clear();
   break;
  
  case '0':
   printf("\n\t程序结束!\n");
   break;
  default:
   printf("\n\t输入错误,请重新输入!\n");
  }
  if(choice != '0'){
   flushall();
   //printf("\t\t 按回车键继续......\n");
   clear();
   scanf("%c",&choice);
  }
 }
}

int main()
{
 Sort_Search();
 return 0;
}

 

 

时间: 2024-11-08 21:51:54

数据结构 排序和查找的相关文章

数据结构实践项目——查找(一)

本文是[数据结构基础系列(8):查找]课程的第一组实践项目. 本文针对: 0801 查找问题导学 0802 线性表的顺序查找 0803 线性表的折半查找 0804 索引存储结构 0805 分块查找 0806 二叉排序树 0807 二叉排序树(续) 0808 平衡二叉树 纸上谈兵:"知原理"检验题目 [参考(部分)] [参考(1)] 1.对于A[0..10]有序表{12,18,24,35,47,50,62,83,90,115,134} (1)用二分查找法查找 90时,需进行多少次查找可确

class-编写一个使用类模板对数组进行排序、查找和求元素和的程序。

问题描述 编写一个使用类模板对数组进行排序.查找和求元素和的程序. 设计一个类模板templateclass Array,用于对T类型的数组进行排序.查找和求元素和,然后由此产生模板类Array和Array. 解决方案 http://www.warting.com/program/201109/33601.html 第四题 解决方案二: 编写一个使用类模板对数组进行排序,查找和求元素和的程序.

一道面试题(关于千万量级数据结构排序)

问题描述 一道面试题(关于千万量级数据结构排序) 题目: 已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名.考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中. 格式 如下: 李四,201008823,678: 张三,201007432,356: 王五,201322233,464: 排序后: 李四,201008823,678: 王五,201322233,464: 王五,201322233,464: 要求:使空间复杂度和时间

编程-数组类模板Array,类中包括对数组进行排序、查找和求元素和 然后由此产生模板类Array&amp;amp;lt;Box&amp;amp;gt;

问题描述 数组类模板Array,类中包括对数组进行排序.查找和求元素和 然后由此产生模板类Array<Box> #include using namespace std;class Box{private: int a b c;public: int V; Box(int chint kint g) { a = ch; b = k; c = g; V = a*b*c; } bool operator <(Box &one) { int temp = V - one.V; if (

排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构

问题描述 排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构 设计一个程序,用于查询一个IP所在的机构.具体要求:1. 设计一个函数,用于比较两个IP地址(字符串)的大小, 2. 从外部数据文件(IP.TXT)中读取IP数据; 3. 用平衡二叉排序树存储IP及其所属机构名称;4. 输入一个IP地址,查找并输出与此IP对应的机构名称; 5. 输入一个机构名称,查询与此机构对应的的IP地址; 解决方案 算法部分可以使用STL. 解决方案二: #inc

数据结构实验之查找一:二叉排序树

数据结构实验之查找一:二叉排序树 Time Limit: 400MS Memory Limit: 65536KB Problem Description 对应给定的一个序列可以唯一确定一棵二叉排序树.然而,一棵给定的二叉排序树却可以由多种不同的序列得到.例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果.你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树. Input 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (n < = 10

PHP常用的排序和查找算法_php技巧

本文汇总了常见的php排序算法和查找,在进行算法设计的时候有不错的借鉴价值.现分享给大家供参考之用.具体如下: <?php /** * PHP最常用的四个排序方法及二种查找方法 * 下面的排序方法全部都通过测试 * auther : soulence * date : 2015/06/20 */ //PHP冒泡排序法 function bubbleSort(&$arr){ //这是一个中间变量 $temp=0; //我们要把数组,从小到大排序 //外层循环 $flag=false;//这个优

浅谈算法和数据结构 十 平衡查找树之B树

前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据.对其进行排序并允许以O(log n)的时间复杂度运行进行查找.顺序读取.插入和删除的数据结构.B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树.与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作.B-tree算法减少定位记录时所经历的中间过程,从而

几种C#框架提供的数据结构对单值查找的效率比较

做分词组件时,有网友提出采用Hashtable 数据结构查找字符串效率较低,建议改为Dictionary,其理由是采用Hashtable 时Key值是object 会触发装箱和拆箱动作,一直对这种说法表示怀疑,因为我理解只有值类型和引用类型通过object 互转时才会发生装箱和查询,引用类型之间强制转换不应发生装箱和拆箱,而Dictionary 泛型实际上底层还是调用的Hashtable,所以效率怎么会比Hashtable 要高呢?今天决定对比较常用的4种数据结构做一个测试,以便以后做系统性能优