数据结构——顺序查找、二分查找,冒泡排序,堆排序

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
#include <iostream> 
#include <iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status; 
typedef int KeyType;	//关键字类型为int 
typedef  struct{
	KeyType key;		//关键字
	//其他域按需定义	
}ElemType;				//元素(记录)类型 

typedef struct{
    ElemType *r;		//存储空间基地址 
    int length;			//表的长度(元素个数) 
}SqList;


Status InitList(SqList  &L){//键盘输入数据表 
  	int n,i;
	cout<<"\n数据个数:";
    cin>>n; 
    L.r=new ElemType[n+1]; 
    if (!L.r) return OVERFLOW;
	cout<<"\n输入数据:";
    for (i=1;i<=n;i++){
	 	cin>>L.r[i].key;//输入n个元素的关键字,其他项略 
	}     
    L.length=n;
 	return OK;
}

Status InitList_random(SqList  &L)//生成随机数表 
{
	int i,n;
	cout<<"\n数据个数:";
	cin>>n;
	L.r=new ElemType[n+1];
	if(!L.r)
	return OVERFLOW;
	srand(time(NULL));
	for(i=1;i<=n;i++)
	{
		L.r[i].key= rand()%1000;
	}
	L.length=n;
	return OK; 
}

Status DestroyList(SqList &L){
	delete []L.r;
	L.r=NULL;
	L.length=0;
	return OK;
}
void OutputList(SqList L){//输出数据表 
    cout<<"\n数据表:";
	for (int i=1;i<=L.length;i++){
    	cout<<setw(4)<<L.r[i].key;    	
	}      
}
//顺序查找
int Search_Seq(SqList L,KeyType key) {

	int i;
	L.r[0].key=key;//设置监视哨 
	for(i=L.length;i>=1&&L.r[i].key!=key;i--);//从后往前查找 
	if(i>=1)    //查找成功,返回位置,否则返回0 
	return i;
	else
	return 0;
}

int Search_Bin(SqList L,KeyType key) {//折半查找 
//在有序表中查找关键字为key的记录,查找成功,返回位置,否则返回0 	
	int low=1,high=L.length,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(key==L.r[mid].key)
		{
			return mid;
		}
		
		else if(key<L.r[mid].key)
		high=mid-1;
		else
		low=mid+1;
	}
	return 0; 
}
void InsertSort(SqList &L)//插入排序 
{
	int i,j;
	for(i=2;i<=L.length;i++)
	{
		if(L.r[i].key<L.r[i-1].key)
		{
			L.r[0]=L.r[i];
			for(j=i-1;L.r[0].key<L.r[j].key;j--)
			{
				L.r[j+1]=L.r[j];
			}
			L.r[j+1]=L.r[0];
		}
	}
}


void SelectSort(SqList &L)//简单选择排序
{
	int i,k,j;
	ElemType temp;
	for(i;i<L.length-1;i++)
	{
		k=i;
		for(j=i+1;j<=L.length;j++)
			if(L.r[j].key<L.r[k].key)
			k=j;
		if(k!=i)
		{
			temp=L.r[i];
			L.r[i]=L.r[k];
			L.r[k]=temp;
		}	
	 } 
 } 
 
void BubbleSort(SqList &L) //冒泡排序
{
	int	m=L.length-1;
	ElemType t;
	int flag=1;  //利用flag来判断此趟排序是否发生了交换 
	while((m>0)&&(flag==1))
	{  
		flag=0;   //先置为0 
		for(int i=1;i<=m;i++)
		{
			if(L.r[i].key>L.r[i+1].key)
			{
				flag=1;     //一旦发生交换就置为1 
				t=L.r[i];
				L.r[i]=L.r[i+1];
				L.r[i+1]=t;
			}
		}
	}
} 

void HeapAdjust(SqList &L,int s,int m)//调整堆 
{
	ElemType rc;
	rc=L.r[s];
	for(int j=2*s;j<=m;j*=2) 
	{
		if(j<m&&L.r[j].key<L.r[j+1].key) ++j;
		if(rc.key>=L.r[j].key) break;
		L.r[s]=L.r[j];
		s=j;
	}
	L.r[s]=rc;
 } 
 
void HeapSort(SqList &L)
{
	int i,j;
	ElemType t;
	for(i=L.length/2;i>0;--i)//将无序序列建成大根堆 
	{
		HeapAdjust(L,i,L.length);
	}
	//cout<<L.r[i].key;
	for(j=L.length;j>1;--j)
	{
		//将堆顶与最后一个交换 
		t=L.r[1];
		L.r[1]=L.r[j];
		L.r[j]=t;
		HeapAdjust(L,1,j-1);//将L.r[1,j-1]重新调整为大根堆 
	}
}

//#include "comdef.h"
//#include "sqlistdef.h"
//#include "sqlistapp.h"
int main(){
	SqList L;
	int choice;
	KeyType key;
	InitList(L);
	do{
		cout<<"\n\n  	 数据查找与排序		";
    	cout<<"\n==========================";
		cout<<"\n  	 1:输出数据表";
		cout<<"\n  	 2:顺序查找法";
    	cout<<"\n  	 3:折半查找法";
    	cout<<"\n  	 4:插入排序法";	
		cout<<"\n  	 5:冒泡排序法";
		cout<<"\n  	 6:堆排序法";
		cout<<"\n  	 0:退出";
		cout<<"\n==========================";
		cout<<"\n输入选择:";
		cin>>choice;
		switch (choice){
			
			case 1:	OutputList(L);									
					break; 
					
			case 2: int a;
			        cout<<"利用顺序查找法查找数据值key=";
					cin>>key;
					a=Search_Seq(L,key);
					if(a!=0)
					cout<<"元素"<<key<<"在表中位置为:"<<a;	
					else
					cout<<"该数据在表中不存在!";									
					break;
					
			case 3: int b;
			        cout<<"利用折半查找法查找数据值key=";
					cin>>key;
					b=Search_Bin(L,key);
					if(b!=0)
					cout<<"元素"<<key<<"在表中位置为:"<<b;	
					else
					cout<<"该数据在表中不存在!";
					break;
			case 4: 
			        InsertSort(L);
			        cout<<"插入排序后的结果为:"; 
			        OutputList(L);
					break;
			case 5: BubbleSort(L);
			 		cout<<"冒泡排序后的结果为:"; 
			        OutputList(L);
					break;	
			case 6: HeapSort(L); 
					cout<<"堆排序后的结果为:"; 
			        OutputList(L);
					break;			
			case 0:	break; 
			default:cout<<"重新输入选择!"; 
					break;
		}	
	} while (choice) ;
	DestroyList(L);		
	return 0; 
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C语言单链表的冒泡排序和查找的实现方法: 1. 单链表的冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的元素,比较相邻的两个元素大小,并根据大小交换位置,直到没有任何一对数字需要比较为止。在单链表中,需要交换节点的指针而不是节点的数据。 ``` void bubble_sort(struct node *head) { struct node *p, *q, *end = NULL; while (head != end) { p = head; while (p->next != end) { q = p->next; if (p->data > q->data) { int tmp = p->data; p->data = q->data; q->data = tmp; } p = p->next; } end = p; } } ``` 上面的代码中,`head` 是链表的头指针,`end` 是排序的结束位置。每次排序结束后,`end` 移动到上一次排序中最后一个节点的位置。内循环中的 `p` 指向当前节点,`q` 指向它后面的节点。如果 `p` 的数据大于 `q` 的数据,交换它们的值。 2. 单链表的查找 单链表的查找和数组的查找类似,也是遍历整个链表,依次比较每个节点的值和目标值是否相等。如果找到了相等的节点,返回该节点的指针,否则返回 NULL。 ``` struct node *search(struct node *head, int value) { struct node *p = head; while (p != NULL) { if (p->data == value) { return p; } p = p->next; } return NULL; } ``` 上面的代码中,`head` 是链表的头指针,`value` 是要查找的值。每次循环中,`p` 指向当前节点,如果当前节点的值等于目标值,返回该节点的指针。如果遍历完整个链表都没有找到相等的节点,返回 NULL。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值