查找和排序的实现(c++实现)

(1)编程实现两种查找方法:折半查找和二叉排序树。若查找成功,返回元素在有序数组中的位置和查找次数;若查找失败,返回出错标志和查找次数。
(2)在9种排序算法(直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序和基数排序)中选择5种排序算法进行编程实现。

1.折半查找

#include <iostream>
using namespace std;
int count;//记录查找次数
int Search_Bin(int key[],int low, int high,int k);
int main(){
    cout<<"折半查找"<<endl;
    int length,address;
    cout<<"请输入有序关键字数组的长度:";
    cin>>length;
    int key[length];
    cout<<"请输入"<<length<<"个有序关键字(不能有小于或等于0的关键字):";
    for(int i=0;i<length;i++){
        cin>>key[i];
    }
    for(int i=0;i<length;i++){
        address=Search_Bin(key,0,length-1,key[i]);
        cout<<"元素"<<key[i]<<"的地址为:"<<address<<endl;
    }
    int x=1;
    while(x>0){
        cout<<"请输入要查找的元素(输入小于或等于0结束查找):";
        cin>>x;
        if(x>0){
            count=0;//初始化查找次数
            address=Search_Bin(key,0,length-1,x);
            if(-1!=address)
                cout<<"元素"<<x<<"的地址为:"<<address<<",查找了"<<count<<"次"<<endl;
            else
                cout<<"元素"<<x<<"查找失败,查找了"<<count<<"次"<<endl;
        }else{
            cout<<"元素小于或等于0,结束查找"<<endl;
            break;
        }
    }
	return 0;
}
int Search_Bin(int key[],int low, int high,int k){
    int mid;
    if(low>high){
        count++;
        return -1;
    }else{
        count++;
        mid=(low+high)/2;
        if(key[mid]==k)
            return mid;
        if(k>key[mid])
            return Search_Bin(key,mid+1,high,k);
        else
            return Search_Bin(key,low,mid-1,k);
    }
}

2.二叉排序树

#include<iostream>
using namespace std;
#define Max 100
int key[Max];
int lenght=0;//中序遍历的结点个数
int count=0;//查找次数
typedef struct BiTNode{
    int data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatBiTree(BiTree &T);
void InOrderTraverse(BiTree T);
int find_address(int key);
int Search(BiTree T,int e);
int main(){
    cout<<"二叉排序树"<<endl;
    BiTree T;
    int e;
    cout<<"建立二叉排序树(-1代表空结点):"<<endl;
    CreatBiTree(T);
    cout<<"中序遍历二叉排序树为:";
    InOrderTraverse(T);
    cout<<endl;
    cout<<"\n请输入要查找的值(输入0表示不查找):";
    cin>>e;
    while(e){
        if(find_address(e)!=-1){
            count=0;
            cout<<e<<"的地址为"<<find_address(e)<<",查找次数为"<<Search(T,e)<<"次"<<endl;
        }else{
            count=0;
            cout<<"查找失败,查找次数为"<<Search(T,e)<<"次"<<endl;
        }
        cout<<"\n请输入要查找的值(输入0表示不查找):";
        cin>>e;
    }

    return 0;
}
//返回查找次数
int Search(BiTree T,int e){
    count++;
    if(T!=NULL){
        if(e==T->data){
            return count;
        }else if(e<T->data){
            return Search(T->lchild,e);
        }else if(e>T->data){
            return Search(T->rchild,e);
        }
    }else{
        return count;
    }
}
//返回地址
int find_address(int e){
    for(int i=0;i<lenght;i++){
        if(e==key[i]){
            return i;
        }else if(i==lenght-1 && e!=key[i]){
            return -1;
        }
    }
}
void InOrderTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);
        key[lenght]=T->data;
        cout<<key[lenght]<<" ";
        lenght++;
        InOrderTraverse(T->rchild);
    }
}
void CreatBiTree(BiTree &T){
    int x;
    cin>>x;
    if(x==-1){
        T=NULL;
    }else{
        T=new BiTNode;
        T->data=x;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}

3.直接插入排序

#include <iostream>
using namespace std;
void InertSort(int arry[],int len);
int main(){
    cout<<"直接插入排序"<<endl;
    int lenght;
    cout<<"请输入直接插入排序数组长度:";
    cin>>lenght;
    int array[lenght];
    cout<<"请输入直接插入排序数组:";
    for(int i=0;i<lenght;i++){
        cin>>array[i];
    }
    InertSort(array,lenght);
    cout<<"直接插入排序后数组为:";
    for(int i=0;i<lenght;i++)
        cout<<array[i]<<" ";
    return 0;
}
void InertSort(int array[],int lenght){
    int i,j;
    for (i=1;i<lenght;i++){
        int temp=array[i];
        for (j=i-1;j>=0;j--){
            if(temp<array[j])
                array[j+1] = array[j];
            else
                break;
        }
        array[j+1] = temp;
    }
}

4.折半插入排序

#include<iostream>
using namespace std;
void binaryInsertionSort(int array[],int n);
int main(){
    cout<<"折半插入排序"<<endl;
    int n;
    cout<<"请输入折半插入排序数组长度:";
    cin>>n;
    int array[n];
    cout<<"请输入折半插入排序数组:";
    for(int i=0;i<n;i++){
        cin>>array[i];
    }
    binaryInsertionSort(array,n);
    cout<<"折半插入排序后的数据为:";
    for(int i=0;i<n;i++){
        cout<<array[i]<<" ";
    }
    return 0;

}
void binaryInsertionSort(int array[],int n){
    int mid;
    for(int i=1;i<n;i++){
        int low=0,high=i-1;
        int temp=array[i];
        while(low<=high){
            mid=(low+high)/2;
            if(array[i]<array[mid])
                high=mid-1;
            else
                low=mid+1;
        }
        for(int j=i-1;j>=high+1;j--)
            array[j+1]=array[j];
        array[high+1]=temp;
    }
}

5.希尔排序

#include <iostream>
using namespace std;
void swap(int & a,int & b);
void ShellSort(int A[],int lenght);
int main()
{
    cout<<"希尔排序"<<endl;
    int lenght;
    cout<<"请输入希尔排序数组长度:";
    cin>>lenght;
    int array[lenght];
    cout<<"请输入希尔排序数组:";
    for(int i=0;i<lenght;i++){
        cin>>array[i];
    }
    ShellSort(array,lenght);
    cout<<"希尔排序后数组为:";
    for(int i=0;i<lenght;i++)
        cout<<array[i]<<" ";
    return 0;
}
void swap(int & a,int & b){
    int tmp=a;
    a=b;
    b=tmp;
}
void ShellSort(int A[],int lenght){
    int d,tmp,j;
    for(d=lenght/2;d>=1;d/=2){
        for(int i=d;i<lenght;i++){
            tmp=A[i];
            j=i-d;
            while(j>=0&&A[j]>tmp){
                swap(A[j],A[j+d]);
                j=j-d;
            }
            A[j+d]=tmp;
        }
    }
}

6.冒泡排序

#include <iostream>
#include <string>
using namespace std;
void BubbleSort(int array[],int lenght);
int main(){
    cout<<"冒泡排序"<<endl;
    int lenght;
    cout<<"请输入冒泡排序数组长度:";
    cin>>lenght;
    int array[lenght];
    cout<<"请输入冒泡排序数组:";
    for(int i=0;i<lenght;i++){
        cin>>array[i];
    }
    BubbleSort(array,lenght);
    cout<<"冒泡排序后数组为:";
    for(int i=0;i<lenght;i++)
        cout<<array[i]<<" ";
	return 0;
}
void BubbleSort(int array[],int lenght){
    for (int i=0;i<lenght-1;i++){
		for(int j=0;j<lenght-1-i;j++){
			if(array[j]>array[j+1]){
				int temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	}
}

7.快速排序

#include<iostream>
using namespace std;
void quickSort(int array[], int l,int h);
int partion(int array[], int l, int h);
int main(){
    cout<<"快速排序"<<endl;
    int lenght;
    cout<<"请输入快速排序数组长度:";
    cin>>lenght;
    int array[lenght];
    cout<<"请输入快速排序数组:";
    for(int i=0;i<lenght;i++){
        cin>>array[i];
    }
	int l=0;
	int h=lenght-1;
	quickSort(array,l,h);
	cout<<"快速排序后数组为:";
    for(int i=0;i<lenght;i++)
        cout<<array[i]<<" ";
	return 0;
}
void quickSort(int array[],int l,int h){
	if(l<h){
		int f=partion(array,l,h);//2个子表的分界线
		quickSort(array,l,f);
		quickSort(array,f+1,h);
	}
}
int partion(int array[], int l, int h){
	int key=l;
	int i=l,j=h;
	int temp1,temp2;
	while(i!=j){
		while(array[j]>array[key]&&i<j)
			--j;
		while(array[i]<array[key] && i<j)
			++i;
		if(i<j){
			temp1=array[j];
			array[j]=array[i];
			array[i]=temp1;
		}
	}
		temp2=array[key];
		array[key]=array[i];
		array[i]=temp2;
		return i;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值