索引排序

一般的排序方法都可以将那些赋值(或交换)都换成对 index 数组的赋值(或交换)

1. 结果下标 IndexArray[i] 存放的是数据 Array[IndexArray[i]] 应该摆放在 Array 中第 i 个位置。

例如:

  • 下标     0   1   2   3   4   5   6   7
  • 排序码 29 25 34 64 34' 12 32 45
  • Index   5   1   0   6   2   4   7   3

插入排序的索引地址排序版本

/****************** 插入排序的索引地址排序版本 ******************/
template<class Record>
void AddrSort(Record Array[], int n)
{
    //n为数组长度
    int *IndexArray = new int[n];
    int i,j,k;
    Record TempRec; //只需一个临时空间
    for (i=0; i<n; i++)
        IndexArray[i] = i;
    for (i=1; i<n; i++) // 依次插入第i个记录
        for (j=i; j>0; j--) // 依次比较,发现逆置就交换
            if ( Array[IndexArray[j]] < Array[IndexArray[j-1]])
                swap(IndexArray, j, j-1);
            else
                break; //此时i前面记录已排序

    // 按下标将数组拍成有序队列
    for(i=0; i<n; i++)
    {
        j = i;
        TempRec = Array[i];
        while (IndexArray[j] != i) // 如果元素不应该处于当前ID
        {
            k = IndexArray[j];
            Array[j]=Array[k];
            IndexArray[j] = j;
            j = k;
        }
        Array[j] = TempRec;
        IndexArray[j] = j;
    }
    delete []IndexArray;
}
2. 结果下标 IndexArray[i] 存放的是 Array[i] 中数据应该待的位置。

例如:

  • 下标     0   1   2   3   4   5   6   7
  • 排序码 29 25 34 64 34' 12 32 45 
  • 索引     2   1   4   7   5   0   3   6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值