c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序Word文件下载.docx
- 文档编号:15812419
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:10
- 大小:18.02KB
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序Word文件下载.docx
《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序Word文件下载.docx》由会员分享,可在线阅读,更多相关《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
for(i=0;
i<
n-1;
i++)/*要选择的次数:
0~n-2共n-1次*/
{
min=i;
/*假设当前下标为i的数最小,比较后再调整*/
for(j=i+1;
j<
n;
j++)/*循环找出最小的数的下标是哪个*/
if(*(x+j)<
*(x+min))
{
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 归并 选择 直接 插入 希尔 冒泡 快速 排序 顺序 二分 查找
![提示](https://static.bdocx.com/images/bang_tan.gif)