001 | #include <stdio.h> |
002 | #include <stdlib.h> |
003 |
int
main()
|
004 | { |
005 |
int
L[11]={0,70,38,65,97,76,93,1,15,68,64}; //0不做排序只是当做哨兵,或者临时交换空间使用。
|
006 |
int
i=0;
|
007 |
printf ( "未排序前序列:\n" );
|
008 |
for (i=1;i<=10;i++)
|
009 |
{
|
010 |
printf ( "%d " ,L[i]);
|
011 |
}
|
012 |
printf ( "\n-------------------------------------\n" );
|
013 |
insertSort(L);
//直接插入排序
|
014 |
//BInsertSort(L); //折半插入排序
|
015 |
//bubbleSort(L);//冒泡排序
|
016 |
//selectSort(L); //选择排序
|
017 |
//heapSort(L,10); //堆排序
|
018 |
printf ( "排序后序列:\n" );
|
019 |
for (i=1;i<=10;i++)
|
020 |
{
|
021 |
printf ( "%d " ,L[i]);
|
022 |
}
|
023 |
return
0;
|
024 | } |
025 |
void
insertSort( int
L[11]) //插入排序 插入排序的最差和平均情况的性能是O(n^2)
|
026 | { |
027 |
int
i=0,j=0;
|
028 |
for (i=2;i<=10;++i)
|
029 |
{
|
030 |
L[0]=L[i];
//监视哨
|
031 |
for (j=i-1;L[0]<L[j];--j)
|
032 |
{
|
033 |
L[j+1]=L[j];
//记录后移
|
034 |
}
|
035 |
L[j+1]=L[0]; //插入记录
|
036 |
}
|
037 | } |
038 |
void
BInsertSort( int
L[11]) //折半查找排序
|
039 | { |
040 |
int
i=0,j=0,low=0,high=0,m=0;
|
041 |
for (i=2;i<=10;++i)
|
042 |
{
|
043 |
L[0]=L[i];
//监视哨
|
044 |
low=1;high=i-1;
|
045 |
while (low<=high){
|
046 |
m=(low+high)/2;
//折半
|
047 |
if (L[0]<L[m])
|
048 |
high=m-1;
|
049 |
else
|
050 |
low=m+1;
|
051 |
}
|
052 |
for (j=i-1;L[0]<L[j];--j)
|
053 |
L[j+1]=L[j];
//记录后移
|
054 |
L[high+1]=L[0];
//插入
|
055 |
}
|
056 | } |
057 |
void
bubbleSort( int
L[11]) //冒泡排序复杂度是O(n^2)
|
058 | { |
059 |
int
i=0,j=0;
|
060 |
for (i=1;i<=10;++i)
|
061 |
{
|
062 |
for (j=1;j<=10-i;++j)
|
063 |
{
|
064 |
if (L[j]>L[j+1])
|
065 |
{
|
066 |
L[0]=L[j];
|
067 |
L[j]=L[j+1];
//用辅助空间交换两个值
|
068 |
L[j+1]=L[0];
|
069 |
}
|
070 |
}
|
071 |
}
|
072 | } |
073 |
void
selectSort( int
L[11]) //选择排序 复杂度为:O(n^2)
|
074 | { |
075 |
int
i=0,j=0,min_idx=0;
|
076 |
for (i=1;i<=10;++i)
|
077 |
{
|
078 |
min_idx=i;
|
079 |
for (j=i+1;j<=10;++j)
|
080 |
{
|
081 |
if (L[j]<L[min_idx])
|
082 |
{
|
083 |
min_idx=j;
|
084 |
}
|
085 |
}
|
086 |
if (min_idx!=i)
|
087 |
{
|
088 |
L[0]=L[i];
|
089 |
L[i]=L[min_idx];
//交换最小值与L[i]
|
090 |
L[min_idx]=L[0];
|
091 |
}
|
092 |
}
|
093 | } |
094 |
void
heapSort( int
L[11], int n)
//堆排序
|
095 | { |
096 |
int
i=0;
|
097 |
for (i=n/2;i>0;--i)
|
098 |
heapAjust(L,i,n);
|
099 |
for (i=n;i>1;--i)
|
100 |
{
|
101 |
L[0]=L[1];
|
102 |
L[1]=L[i];
|
103 |
L[i]=L[0];
|
104 |
heapAjust(L,1,i-1);
|
105 |
}
|
106 | } |
107 |
void
heapAjust( int
L[11], int s, int
m) //建大顶堆,使L[s...m]为大顶堆
|
108 | { |
109 |
int
rc=L[s],i=0;
|
110 |
for (i=2*s;i<=m;i*=2)
|
111 |
{
|
112 |
if (i<m&&L[i]<L[i+1])
|
113 |
++i;
|
114 |
if (rc>=L[i])
|
115 |
break ;
|
116 |
L[s]=L[i];
|
117 |
s=i;
|
118 |
}
|
119 |
L[s]=rc;
|
120 | } |