在排序时,若是数据很复杂,对数据的移动显然是费时的。若把数据移动改为指针移动,则减少了操作复杂度。索引排序,也叫地址排序,就是这种排序思想。
根据索引的含义不同,索引排序的算法上也主要分为两种。
一、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