冒泡排序和选择排序算法两个排序算法 、三个查找算法及测试程序
/*排序算法1、冒泡排序2、插入排序3、选择排序4、希尔排序5、归并排序6、快速排序7、堆排序8、基数排序*/
int BubbleSort(int a[],int n)
{
int i=0,j=0;
int temp=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return 1;
}
//选择排序
int SelectSort(int a[],int n)
{
int i=0,j=0;
int flag=-1;
int temp=0;
for(i=0;i<n-1;i++)
{
//这两个哨兵变量一定要先初始化
temp=a[i];
flag=i;
for(j=i+1;j<n;j++)
{
if(a[j]<temp)
{
temp=a[j];
flag=j;
}
}
if(flag!=i)
{
a[flag]=a[i];
a[i]=temp;
}
}
}
/*常用的查找算法1、顺序查找 2、二分法查找 3、基于插入的二分查找 4、斐波那契改进的二分查找
5、哈希查找 哈希函数 解决冲突办法: 除留取余法、平方取中法、数据分析法*/
int SequnceFind(int a[],int n,int x)
{
int i=-1;
for(i=0;i<n;i++)
if(a[i]==x)
return i+1;
return -1;
}
//二分法查找
int BinaryFind(int a[],int low,int high,int x)
{
if(low>high)
return -1;//没有找到数据
int mid=(low+high)/2;
if(a[mid]==x)
return mid;
else
{
if(a[mid]>x)
{
high=mid-1;
BinaryFind(a,low,high,x);
}
else
{
low=mid+1;
BinaryFind(a,low,high,x);
}
}
}
//对于均匀分布的数据,大量数据使用插值查找法最合适了
int BinaryFindImprove(int a[],int low,int high,int x)
{
if(low>high)
return -1;//没有找到数据
int mid=(x-a[low])/(a[high]-a[low])*(high-low)+low;
if(a[mid]==x)
return mid;
else
{
if(a[mid]>x)
{
high=mid-1;
BinaryFindImprove(a,low,high,x);
}
else
{
low=mid+1;
BinaryFindImprove(a,low,high,x);
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
#define DATA_NUM 10
#include "list.h"
#include "sort.h"
#include "find.h"
//添加链表数据,建立链表
ElemType num[]={10,20,30,11,22,33,10,15,20,26,10,20,30,11,22,33,10,15,20,26};
LinkList L;
void Catalogue()
{
int choose;
int data=0;
start://定义循环段,可以循环填入数据
printf("请输入你的选择:1-全部显示 2-插入 3-查找 4-删除 0-结束程序\n");
printf("Please input your choose:");
scanf("%d",&choose);
switch(choose){
case 1:
PrintList(L);
break;
case 2:
printf("请输入要添加节点的数据值:");
scanf("%d",&data);
InsertList(L,L->next,data);
break;
case 3:
break;
case 4:
printf("请输入你要删除节点的数据值:");
scanf("%d",&data);
DeleteList(L,data);
break;
default:
printf("结束当前程序的执行!\n");
goto end;
break;
}
goto start;
end:;
}
void SortTest()
{
int data[DATA_NUM]={0};
srand((unsigned int)time(NULL));//设置随机数种子。
for(int i=0;i<DATA_NUM;i++)
data[i]=rand()%100;
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n");
//调用冒泡排序算法,对产生的0-99之间的数字进行排序
//BubbleSort(data,DATA_NUM);
//调用选择排序算法,对产生的0-99之间的数字进行排序
SelectSort(data,DATA_NUM);
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n");
}
void FindTest()
{
int data[DATA_NUM]={20,13,43,48,54,29,3,71,15,69};
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n使用选择排序法对这10个数据从小到大排序\n");
//调用选择排序算法,数字进行排序
SelectSort(data,DATA_NUM);
// BubbleSort(data,DATA_NUM);
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n");
printf("48所在的位置为%d(顺序查找)\n",SequnceFind(data,10,71));
printf("48所在的位置为%d(二分法查找)\n",BinaryFind(data,0,9,71)+1);
}
//测试程序
int main() {
// CreateListR(L,num,20);
//显示目录
// Catalogue();
int data[DATA_NUM]={10,20,30,40,50,60,70,80,90,100};
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n使用选择排序法对这10个数据从小到大排序\n");
//调用选择排序算法,数字进行排序
SelectSort(data,DATA_NUM);
// BubbleSort(data,DATA_NUM);
for(int i=0;i<DATA_NUM;i++)
printf("%d ",data[i]);
printf("\n");
printf("48所在的位置为%d(顺序查找)\n",SequnceFind(data,10,71));
printf("48所在的位置为%d(二分法查找)\n",BinaryFind(data,0,9,71));
printf("80所在的位置为%d(二分法查找)\n",BinaryFindImprove(data,0,9,80));
return 1;
}