排序思路:
每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。
//直接插入排序
void InsertSort(RecType R[], int n)
{
int i,j; RecType tmp;
for(i=1;i<n;i++)
{
if(R[i].key<R[i-1].key)//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句
{
tmp = R[i];
j = i-1;
do
{
R[j+1] = R[j]; //将关键字大于R[i].key的记录后移
j--;
} while(j>=0 && R[j].key>tmp.key)
R[j+1] = tmp; //在j+1处插入R[i]
}
}
}
//平均O(n^2)
//二分插入排序
void BinInsertSort(RecType R[], int n)
{
int i,j,low,high,mid;
RecType tmp;
for(i=1;i<n;i++)
{
if(R[i].key<R[i-1].key)
{
tmp = R[i];
low = 0; high = i-1;
while(low<=high)
{
mid = (low + high)/2;
if(tmp.key<R[mid].key)
high = mid - 1;
else
low = mid + 1;
}
for(j=i-1;j>=high+1;j--)
R[j+1] = R[j];
R[high+1] = tmp;
}
}
}
//希尔排序算法
void ShellSort(RecType R[], int n)
{
int i,j,d;
RecType tmp;
d = n/2; //增量置初值
while(d>0)
{
for(i=d;i<n;i++)
{
tmp = R[i];
j = i-d;
while(j>=0 && tmp.key < R[j].key)
{
R[j+d] = R[j];
j = j-d;
}
R[j+d] = tmp;
}
d = d/2;
}
}