在排序时,若是数据很复杂,对数据的移动显然是费时的。若把数据移动改为指针移动,则减少了操作复杂度。索引排序,也叫地址排序,就是这种排序思想。
根据索引的含义不同,索引排序的算法上也主要分为两种。
一、index[i]为array[i]最终在有序序列中的位置。
二、index[i]为位置i上最终应存放元素的下标。即最终元素按array[index[0]]、array[index[1]]……有序。
原序列 array: 17 19 23 21 38 5 33 22
下标:0 1 2 3 4 5 6 7
index1:1 2 5 3 7 0 6 4
index2:5 0 1 3 7 2 6 4
得到索引数组后,根据索引数组对元素进行重排,由于index含义不同,重排算法也不同。下面直接给出两种索引排序代码,代码中有详细注释:
#include<iostream>
#include<iomanip>
using namespace std;
/*
索引排序一
index[i]是array[i]的最终下标
*/
void IndexSort1(int array[], int n)
{
if (array && n > 1)
{
//创建索引数组
int *index = new int[n];
//初始化索引数组
int i, j;
for (i = 0; i < n; i++)
index[i] = i;
//类似于插入排序,在插入比较的过程中不断地修改index数组
for (i = 1; i < n; i++)
{
j = i;
while (j)
{
if (array[i] < array[j-1])
{
index[i]--;
index[j - 1]++;
}
j--;
}
}
//打印索引数组
cout << "索引数组" << endl;
for (i = 0; i < n; i++)
cout << setw(4) << index[i];
cout << endl;
//根据index数组,重排原序列
bool modified = true;
while (modified)
{
modified = false;
for (i = 0; i < n - 1; i++)
{
//如果不在位置上,则调整
if (index[i] != i)
{
modified = true;
j = index[i];
swap(array[i], array[j]);
index[i] = index[j];
index[j] = j;
}
}
}
//释放空间
delete[]index;
}
}
//打印
void print(int array[], int n)
{
if(array && n>0)
{
int i;
for (i = 0; i < n; i++)
cout << setw(4) << array[i];
cout << endl;
}
}
int main()
{
cout << "***索引排序***by David***\n";
int array[] = {17, 19, 23, 21, 38, 5, 33, 22};
int n = sizeof(array) / sizeof(array[0]);
cout << "原序列\n";
print(array, n);
cout << "索引排序一" << endl;
IndexSort1(array, n);
cout << "排序后" << endl;
print(array, n);
system("pause");
return 0;
}
#include<iostream>
#include<iomanip>
using namespace std;
/*
索引排序二
index[i]是array[i]中应该放置数据的下标
*/
void IndexSort2(int array[], int n)
{
if (array && n > 1)
{
//创建索引数组
int *index = new int[n];
//初始化索引数组
int i, j;
for (i = 0; i < n; i++)
index[i] = i;
//类似于插入排序,在插入比较的过程中不断地修改index数组
for (i = 0; i < n; i++)
{
j = i;
while (j)
{
if (array[index[j]] < array[index[j - 1]])
swap(index[j], index[j - 1]);
else
break;
j--;
}
}
//打印索引数组
cout << "索引数组" << endl;
for (i = 0; i < n; i++)
cout << setw(4) << index[i];
cout << endl;
//元素重排
int temp, k;
for (i = 0; i < n; i++)
{
j = i;
temp = array[i];
while (index[j] != i)
{
k = index[j];
array[j] = array[k];
index[j] = j;
j = k;
}
array[j] = temp;
index[j] = j;
}
//释放空间
delete[]index;
}
}
//打印
void print(int array[], int n)
{
if(array && n>0)
{
int i;
for (i = 0; i < n; i++)
cout << setw(4) << array[i];
cout << endl;
}
}
int main()
{
cout << "***索引排序***by David***\n";
int array[] = {17, 19, 23, 21, 38, 5, 33, 22};
int n = sizeof(array) / sizeof(array[0]);
cout << "原序列\n";
print(array, n);
cout << "索引排序二" << endl;
IndexSort2(array, n);
cout << "排序后" << endl;
print(array, n);
system("pause");
return 0;
}
转载请注明出处,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/37889669
若有所帮助,顶一个哦!
专栏目录:数据结构与算法目录
原文:http://blog.csdn.net/zhangxiangdavaid/article/details/37889669