算法学习 之排序

 

/***********直接插入排序***************/
void InsertSort ( Elem R[ ], int n) 
{  // 对记录序列R[1..n]作直接插入排序。
for ( i=2; i<=n; ++i ) 
{
if( R[i] <= R[i-1] )
{   R[0] = R[i];   // 复制为监视哨
    R[i] = R[i-1]      
for ( j=i-2; R[0] < R[j]; --j )
R[j+1] = R[j];        // 记录后移
R[j+1] = R[0];        // 插入到正确位置
}  //if
}
} // InsertSort

/***********折半插入排序***************/

void BiInsertSort (Elem R[ ], int n) 
{  // 对记录序列R[1..n]作折半插入排序。
for ( i=2; i<=n; ++i ) 
{
R[0] = R[i];   // 将R[i]暂存到R[0]
low = 1;    high = i-1;
while (low<=high)
{  //在R[low..high]中折半查找插入的位置
m = (low+high)/2;  // 折半
if (R[0] < R[m])
high = m-1; // 插入点在低半区
else low = m+1; // 插入点在高半区
}  //while
for ( j=i-1; j>=high+1; --j )
R[j+1] = R[j]; // 记录后移
R[high+1] = R[0]; // 插入
} // BinsertSort

/***********希尔插入排序***************/
void ShellInsert ( Elem R[ ], int dk ) 
{  // 对待排序列R作一趟希尔插入排序。本算法对直接插入算法作了以下
// 修改:1. 前后记录位置的增量是dk,而不是1;
//       2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
for ( i=dk+1; i<=n; ++i )
if ( R[i]< R[i-dk]) 
{  // 需将R[i]插入有序增量子表
R[0] = R[i];     // 暂存在R[0]
for (j=i-dk; j>0 && R[0]< R[j]; j-=dk)
R[j+dk] = R[j];   // 记录后移,查找插入位置
R[j+dk] = R[0];      // 插入
}
} // ShellInsert

void ShellSort (Elem R[ ], int d [ ], int t)
{  // 按增量序列d [0..t-1]对顺序表L作希尔排序。
for (k=0; k<t; ++t)
ShellInsert(R, d[k]); // 一趟增量为d [k]的插入排序
} // ShellSort
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值