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 | } |