一般的排序方法都可以将那些赋值(或交换)都换成对 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