(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;
}