211 lines
3.9 KiB
Markdown
211 lines
3.9 KiB
Markdown
# 原创
|
||
: 第八章 排序算法
|
||
|
||
# 第八章 排序算法
|
||
|
||
```
|
||
#include <stdio.h>
|
||
|
||
//1.插入排序
|
||
void InsetSort(int R[], int n)
|
||
{
|
||
int i,j,temp;
|
||
for(i=1;i<n;++i)
|
||
{
|
||
//将待插关键字存入temp中
|
||
temp=R[i];
|
||
j=i-1;
|
||
while(j>=0&&temp<R[j])
|
||
{
|
||
R[j+1]=R[j];
|
||
--j;
|
||
}
|
||
//j+1相当于需要插入的关键字的位置
|
||
R[j+1]=temp;
|
||
}
|
||
}
|
||
|
||
//2.折半插入排序
|
||
//返回有序关键字
|
||
int order(int R[], int n)
|
||
{
|
||
int i;
|
||
for(i=0;i<n;++i)
|
||
{
|
||
if(R[i]>R[i+1])return i;
|
||
}
|
||
}
|
||
|
||
void HarfSort(int R[], int n)
|
||
{
|
||
int i,j,m;
|
||
int s,k,temp;
|
||
int high;
|
||
high = order(R,n);
|
||
for(s=high+1;s<n;++s)
|
||
{
|
||
temp=R[s];//待插关键字
|
||
i=0;j=s-1;//需要将temp其中插入的序列
|
||
while(i<=j)
|
||
{
|
||
//有序中间关键字
|
||
m=(i+j)/2;
|
||
//如果关键字的值小于中间值,则右边等于中间关键字
|
||
if(temp<R[m])j=m-1;
|
||
else i=m+1;
|
||
}
|
||
//将元素右移,方便关键字插入
|
||
for(k=s-1;k>=m;--k)R[k+1]=R[k];
|
||
R[i]=temp; //不知道为什么是i
|
||
}
|
||
}
|
||
|
||
//3.起泡排序
|
||
void BubbleSort(int R[], int n)
|
||
{
|
||
int i,j,flag,temp;
|
||
for(i=n-1;i>=0;--i)
|
||
{
|
||
flag=0;
|
||
for(j=1;j<=i;++j)
|
||
{
|
||
if(R[j-1]>R[j])
|
||
{
|
||
temp=R[j-1];
|
||
R[j-1]=R[j] ;
|
||
R[j]=temp;
|
||
flag=1;
|
||
}
|
||
}
|
||
if(flag==0)return;
|
||
}
|
||
}
|
||
|
||
|
||
//4.起泡排序2
|
||
void BubbleSort2(int R[], int n)
|
||
{
|
||
int i,temp;
|
||
int len = n;
|
||
while(len>0)
|
||
{
|
||
for(i=0;i<n-1;++i)
|
||
{
|
||
if(R[i]>R[i+1])
|
||
{
|
||
temp=R[i];
|
||
R[i]=R[i+1];
|
||
R[i+1]=temp;
|
||
}
|
||
}
|
||
--len;
|
||
}
|
||
}
|
||
|
||
//5.快速排序
|
||
void QuikSort(int R[], int low, int high)
|
||
{
|
||
int temp;
|
||
int i=low, j=high;
|
||
if(low<high)
|
||
{
|
||
temp=R[low];
|
||
while(i<j&&R[j]>=temp)--j;
|
||
if(i<j)
|
||
{
|
||
R[i]=R[j];
|
||
++i;
|
||
}
|
||
while(i<j&&R[i]<temp)++i;
|
||
if(i<j)
|
||
{
|
||
R[j]=R[i];
|
||
--j;
|
||
}
|
||
R[i]=temp;
|
||
QuikSort(R,low,i-1);
|
||
QuikSort(R,i+1,high);
|
||
}
|
||
}
|
||
|
||
//6.简单选择排序
|
||
//挑出最小的关键字
|
||
void SelectSort(int R[], int n)
|
||
{
|
||
int i,j,k,temp;
|
||
for(i=0;i<n;++i)
|
||
{
|
||
k=i;
|
||
for(j=i+1;j<n;++j)
|
||
{
|
||
if(R[k]>R[j])
|
||
k=j;
|
||
}
|
||
temp=R[i];
|
||
R[i]=R[k];
|
||
R[k]=temp;
|
||
}
|
||
}
|
||
|
||
//7.堆排序
|
||
// 完成low到high上的low结点的调整
|
||
void Sift(int R[], int low, int high)
|
||
{
|
||
int i=low,j=2*i+1;
|
||
int temp=R[i];
|
||
|
||
while(j<=high)
|
||
{
|
||
if(j<high&&R[j]<R[j+1])
|
||
++j;
|
||
if(temp<R[j])
|
||
{
|
||
R[i]=R[j];
|
||
i=j;
|
||
j=2*i+1;
|
||
}
|
||
else break;
|
||
}
|
||
R[i]=temp;
|
||
}
|
||
|
||
void HeapSort(int R[], int n)
|
||
{
|
||
int i;
|
||
int temp;
|
||
//建立初始堆
|
||
for(i<n/2;i>=0;--i)
|
||
Sift(R,i,n);
|
||
//出栈
|
||
for(i=n-1;i>=1;--i)
|
||
{
|
||
temp=R[0];
|
||
R[0]=R[i];
|
||
R[i]=temp;
|
||
Sift(R,0,i-1);
|
||
}
|
||
}
|
||
|
||
//8.测试
|
||
int main()
|
||
{
|
||
int i,len;
|
||
int R[10]= {99,6,7,4,5,5,4,8,29,20};
|
||
len=sizeof(R)/sizeof(R[0]);
|
||
|
||
//InsetSort(R, len);
|
||
//HarfSort(R,len);
|
||
//BubbleSort(R, len);
|
||
//BubbleSort2(R,len);
|
||
QuikSort(R,0,len-1);
|
||
//SelectSort(R,len);
|
||
//HeapSort(R,len);
|
||
|
||
for(i=0;i<len;++i)printf("%d\n",R[i]);
|
||
|
||
printf("Press enter to continue ...");
|
||
getchar();
|
||
return 0;
|
||
}
|
||
```
|