c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序文档格式.docx
《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序文档格式.docx》由会员分享,可在线阅读,更多相关《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
{
min=j;
/*如果后面的数比前面的小,则记下它的下标*/
}
}
if(min!
=i)/*如果min在循环中改变了,就需要交换数据*/
t=*(x+i);
*(x+i)=*(x+min);
*(x+min)=t;
}
直接插入排序
voidinsert_sort(int*x,intn)
inti,j,t;
for(i=1;
1~n-1共n-1次*/
/*
暂存下标为i的数。
注意:
下标从1开始,原因就是开始时
第一个数即下标为0的数,前面没有任何数,单单一个,认为
它是排好顺序的。
*/
t=*(x+i);
for(j=i-1;
j>
=0&
&
t<
*(x+j);
j--)/*注意:
j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。
*(x+j+1)=*(x+j);
/*如果满足条件就往后挪。
最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/
*(x+j+1)=t;
/*找到下标为i的数的放置位置*/
冒泡排序
voidbubble_sort(int*x,intn)
intj,k,h,t;
for(h=n-1;
h>
0;
h=k)/*循环到没有比较范围*/
for(j=0,k=0;
h;
j++)/*每次预置k=0,循环扫描后更新k*/
if(*(x+j)>
*(x+j+1))/*大的放在后面,小的放到前面*/
t=*(x+j);
*(x+j)=*(x+j+1);
/*完成交换*/
k=j;
/*保存最后下沉的位置。
这样k后面的都是排序排好了的。
希尔排序
voidshell_sort(int*x,intn)
inth,j,k,t;
for(h=n/2;
h=h/2)/*控制增量*/
for(j=h;
j++)/*这个实际上就是上面的直接插入排序*/
for(k=j-h;
(k>
*(x+k));
k-=h)
*(x+k+h)=*(x+k);
*(x+k+h)=t;
快速排序
数组名称(也就是数组首地址)、数组中起止元素的下标
voidquick_sort(int*x,intlow,inthigh)
if(low<
high)/*要排序的元素起止下标,保证小的放在左边,大的放在右边。
这里以下标为low的元素为基准点*/
i=low;
j=high;
t=*(x+low);
/*暂存基准点的数*/
while(i<
j)/*循环扫描*/
j&
*(x+j)>
t)/*在右边的只要比基准点大仍放在右边*/
j--;
/*前移一个位置*/
if(i<
j)
*(x+i)=*(x+j);
/*上面的循环退出:
即出现比基准点小的数,替换基准点的数*/
i++;
/*后移一个位置,并以此为基准点*/
*(x+i)<
=t)/*在左边的只要小于等于基准点仍放在左边*/
/*后移一个位置*/
j)
*(x+j)=*(x+i);
即出现比基准点大的数,放到右边*/
*(x+i)=t;
/*一遍扫描完后,放到适当位置*/
quick_sort(x,low,i-1);
/*对基准点左边的数再执行快速排序*/
quick_sort(x,i+1,high);
/*对基准点右边的数再执行快速排序*/
堆排序
渗透建堆
数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
voidsift(int*x,intn,ints)
intt,k,j;
t=*(x+s);
/*暂存开始元素*/
k=s;
/*开始元素下标*/
j=2*k+1;
/*右子树元素下标*/
while(j<
n)
if(j<
n-1&
*(x+j)<
*(x+j+1))/*判断是否满足堆的条件:
满足就继续下一轮比较,否则调整。
j++;
if(t<
*(x+j))/*调整*/
*(x+k)=*(x+j);
/*调整后,开始元素也随之调整*/
j=2*k+1;
else/*没有需要调整了,已经是个堆了,退出循环。
break;
}
*(x+k)=t;
/*开始元素放到它正确位置*/
voidheap_sort(int*x,intn)
inti,k,t;
//int*p;
for(i=n/2-1;
i>
=0;
i--)
sift(x,n,i);
/*初始建堆*/
for(k=n-1;
k>
=1;
k--)
t=*(x+0);
/*堆顶放到最后*/
*(x+0)=*(x+k);
*(x+k)=t;
sift(x,k,0);
/*剩下的数再建堆*/
/*构造随机输出函数类*/
voidinput(inta[]){
inti;
srand((unsignedint)time(NULL));
for(i=0;
i<
4;
i++)
a[i]=rand()%100;
printf("
\n"
);
/*构造键盘输入函数类*/
/*voidinput(int*p)
inti;
printf("
请输入%d个数据:
MAX);
MAX;
scanf("
%d"
p++);
}*/
/*构造输出函数类*/
voidoutput(int*p)
for(i=0;
%d"
*p++);
//归并排序中的合并算法
voidMerge(inta[],intstart,intmid,intend)
inti,k,j,temp1[10],temp2[10];
intn1,n2;
n1=mid-start+1;
n2=end-mid;
//拷贝前半部分数组
for(i=0;
n1;
temp1[i]=a[start+i];
//拷贝后半部分数组
for(i=0;
n2;
temp2[i]=a[mid+i+1];
//把后面的元素设置的很大
temp1[n1]=temp2[n2]=1000;
//逐个扫描两部分数组然后放到相应的位置去
for(k=start,i=0,j=0;
k<
=end;
k++)
if(temp1[i]<
=temp2[j])
a[k]=temp1[i];
else
a[k]=temp2[j];
//归并排序
voidMergeSort(inta[],intstart,intend)
if(start<
end)
i=(end+start)/2;
//对前半部分进行排序
MergeSort(a,start,i);
//对后半部分进行排序
MergeSort(a,i+1,end);
//合并前后两部分
Merge(a,start,i,end);
/*顺序查找*/
voidSequenceSearch(int*fp,intLength)
intdata;
开始使用顺序查询.\n请输入你想要查找的数据.\n"
scanf("
&
data);
for(i=0;
i<
Length;
i++)
if(fp[i]==data)
经过%d次查找,查找到数据%d,表中位置为%d.\n"
i+1,data,i);
return;
经过%d次查找,未能查找到数据%d.\n"
i,data);
/*二分查找*/
voidSearch(int*fp,intLength)
intbottom,top,middle;
inti=0;
开始使用二分查询.\n请输入你想要查找的数据.\n"
由于二分查找法要求数据是有序的,现在开始为数组排序.\n"
Sort(fp,Length);
数组现在已经是从小到大排列,下面将开始查找.\n"
bottom=0;
top=Length;
while(bottom<
=top)
middle=(bottom+top)/2;
if(fp[middle]<
data)
bottom=middle+1;
elseif(fp[middle]>
top=middle-1;
经过%d次查找,查找到数据%d,在排序后的表中的位置为%d.\n"
i,data,middle);
return;
voidSort(int*fp,intLength)
inttemp;
inti,j,k;
现在开始为数组排序,排列结果将是从小到大.\n"
for(j=0;
j<
Length-i-1;
j++)
if(fp[j]>
fp[j+1])
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
排序完成!
\n下面输出排序后的数组:
for(k=0;
k<
k++)
%5d"
fp[k]);
voidmain()
{
intstart=0,end=3;
int*p,i,a[MAX];
intcount=MAX;
intarr[MAX];
intchoise=0;
/*printf("
请输入你的数据的个数:
count);
/*printf("
请输入%d个数据\n"
count);
count;
arr[i]);
/*录入测试数据*/
input(a);
随机初始数组为:
output(a);
do
1.使用顺序查询.\n2.使用二分查找法查找.\n3.退出\n"
choise);
if(choise==1)
SequenceSearch(a,count);
elseif(choise==2)
Search(a,count);
elseif(choise==3)
}while(choise==1||choise==2||choise==3);
/*测试选择排序*/
p=a;
选择排序之后的数据:
select_sort(p,MAX);
output(a);
system("
pause"
/**/
input(a);
/*测试直接插入排序*/
直接插入排序之后的数据:
insert_sort(p,MAX);
/*测试冒泡排序*/
冒泡排序之后的数据:
/*测试快速排序*/
快速排序之后的数据:
quick_sort(p,0,MAX-1);
/*测试堆排序*/
堆排序之后的数据:
heap_sort(p,MAX);
/*测试归并排序*/
归并排序之后的数据:
MergeSort(a,start,end);