快速排序与查找

排序和查找程序设计

实验目的:

1.掌握快速排序方法,实现无序数据的快速排序;

2. 掌握二分查找方法,实现有序数据的二分查找;

实验任务:

1. 编写算法实现快速排序:首先建立静态查找表,然后对其进行快速排序(非递减),输出排序后的数据序列;

2. 编写算法实现二分查找:在第1题有序表的基础上根据查找元素进行二分查找,并给出查找过程中依次比较元素的下标,查找成功时给出元素所在的位序,不成功时给出“未找到该元素”的信息;

 

测试数据:

输入的数据元素原始序列为(79,4,34,2,7,3,43,12,36,55,74,87,80);

对其进行快速排序后,查找的数据元素分别为2,79,88和90

实验要求:

1、   采用顺序存储的数据结构建立静态查找表。

2、   静态查找表的建立直接进行赋值,不需要从键盘依次输入。

3、   对静态查找表进行快速排序后输出有序序列(非递减);

4、   需要查找的元素从键盘输入;

5、   静态查找表的基本操作应定义相应的函数实现。


头文件

#ifndef STATICSEARCHTABLE_H_INCLUDED
#define STATICSEARCHTABLE_H_INCLUDED
#include<iostream>
#include<cstring>
using namespace std;

typedef int KeyType;
//元素类型
typedef struct
{
    KeyType Key;//关键字域
    int data;//其他域
}ElemType;

typedef struct//静态查找表的顺序存储结构
{
    ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号留空
    int length;//表长度
}SSTable;

void Create(SSTable &ST,int n);//构造一个含有n个数据元素的静态查找表
void Destroy(SSTable &ST);//销毁静态查找表ST
int Search(SSTable &ST,KeyType Key);//在顺序表ST中顺序查找关键字等于Key的数据元素,若找到,则返回该元素在表中的位置,否则返回0
int BinSearch(SSTable &ST,KeyType Key, int low, int high);//二分法查找
void menu();//主菜单
int Partition(SSTable &ST, int low, int high);
//交换顺序表中子表的记录,并使枢轴记录到位并返回其所在位置,此时在它之前(后)的记录均不大于(小于)它
void Qsort(SSTable &ST,int low, int high);//对顺序表的子序列做快速排序
void swap(int a, int b);

#endif // STATICSEARCHTABLE_H_INCLUDED

.cpp文件

#include"StaticSearchTable.h"
#include<stdio.h>
#include<malloc.h>
//构造一个含有n个数据元素的静态查找表
void Create(SSTable &ST,int n)
{
    ElemType *p = (ElemType *)malloc((n+1)*sizeof(ElemType));//多分配一个空间为监视哨
    ST.elem = p;//把p的基址指向顺序表的基址
    ST.length = n;//顺序表的长度
}



//销毁静态查找表ST
void Destroy(SSTable &ST)
{
    free(ST.elem);
}

//在顺序表ST中顺序查找关键字等于Key的数据元素,若找到,则返回该元素在表中的位置,否则返回0
int Search(SSTable &ST,KeyType Key)
{
    int i;
    ST.elem[0].Key = Key;
    for(i=ST.length; ST.elem[i].Key != Key; i--)
        ;//从后往前找
        if(i == 0)
            printf(" 未能找到该元素");
    return i;
}

//二分法查找
int BinSearch(SSTable &ST,KeyType Key, int low, int high)
{
    int mid;
    if(low > high)
        return -1;
    mid = (low+high)/2;
    printf("%d\t",ST.elem[mid].Key);
    if(ST.elem[mid].Key == Key)
        return mid;
    else if(ST.elem[mid].Key >= Key)
        return BinSearch(ST,Key,low,mid-1);
    else
        return BinSearch(ST,Key,mid+1,high);
}
void swap(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

//交换顺序表中子表的记录,并使枢轴记录到位并返回其所在位置,此时在它之前(后)的记录均不大于(小于)它
int Partition(SSTable &ST, int low, int high)
{
    int pivotkey = ST.elem[low].Key;//用子表的第一个位置做枢轴记录
    while(low < high)
    {
        while(low < high && ST.elem[high].Key >= pivotkey)
            --high;
        swap(ST.elem[low], ST.elem[high]);
        while(low < high && ST.elem[low].Key <= pivotkey)
            ++low;
        swap(ST.elem[low], ST.elem[high]);
    }
    return low;
}

//对顺序表的子序列做快速排序
void Qsort(SSTable &ST,int low, int high)
{
    if(low < high)
    {
        int pivotloc = Partition(ST,low,high);
        Qsort(ST,low,pivotloc-1);
        Qsort(ST,pivotloc+1,high);
    }
}

void menu()
{
    printf("1.");
    printf("请输入您的选择:");
}

主函数

#include <iostream>
#include <stdio.h>
#include"StaticSearchTable.h"

using namespace std;

int main()
{
    SSTable ST;
    int a[13]={79,4,34,2,7,3,43,12,36,55,74,87,80};
    int n = 13;
    int i;
    Create(ST,n);
    for(i = 1; i <= n; i++)
    {
        ST.elem[i].Key = a[i-1];
    }
    printf("初始化输入的元素为:\n");
    for(i = 0; i < 13; i++)
    {
        printf("%d  ",a[i]);
    }
    Qsort(ST,1,n);
    printf("\n快速排序结果为:\n");
    for(i = 1; i <= n; i++)
    {
        printf("%d  ",ST.elem[i].Key);
    }
    int k;
    while(k != 0)
    {
         printf("\n请输入您要查找的元素:");
         scanf("%d",&k);
         int d ;
         printf("按顺序查找查找位置为:");
         printf("%d",d = Search(ST,k));
         printf("\n按顺序查找查找次数为: %d",ST.length - d);
         printf("\n按二分法查找经过的元素为: ");
         if(BinSearch(ST,k,1,n) == -1)
         {
            printf("未能找到该元素!\n");
         }


    }


    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值