索引排序

索引排序

在排序时,若是数据很复杂,对数据的移动显然是费时的。若把数据移动改为指针移动,则减少了操作复杂度。索引排序,也叫地址排序,就是这种排序思想。

索引含义

根据索引的含义不同,索引排序的算法上也主要分为两种。

一、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

若有所帮助,顶一个哦!

专栏目录:数据结构与算法目录

索引排序,布布扣,bubuko.com

时间: 2024-11-03 22:25:39

索引排序的相关文章

IOS UITableView索引排序功能

UITbableView分组展示信息时,有时在右侧会带索引,右侧的索引一般为分组的首字母,比如城市列表的展示.当点击右侧索引的字母,列表会快速跳到索引对应的分组,方便我们快速查找.下面,就介绍一下索引的最简单地设置. 设置表格索引的步骤: 1.添加表格,设置代理和数据源 2.得到要显示的数据的数组 3.得到右侧显示索引的数组,索引数组中元素的个数要与显示的分组数量对应 4.实现tableview中必须实现的几个方法 5.实现sectionIndexTitlesForTableView:方法,在这

mysql使用索引扫描来做排序

mysql有两种方式可以生成有序的结果,通过排序操作或者按照索引顺序扫描,如果explain的type列的值为index,则说明mysql使用了索引扫描来做排序(不要和extra列的Using index搞混了,那个是使用了覆盖索引查询).扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录,但如果索引不能覆盖查询所需的全部列,那就不得不扫描一条索引记录就回表查询一次对应的整行,这基本上都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在IO密集型的工作

联系人列表字母排序索引(三)

也是忙忙碌碌好几天,今天又有时间了,继续这个文章的编写.今天是这篇文章的最后一部分.主要内容包括以下几点: 1.将中文名字转化成拼音,并提取首字母,进行排序. 2.实现分组列表Adapter模板. 3.将列表与索引结合在一起. pinyin4j是一个将中文转化成拼音的高效工具,我的源码中带了这个依赖包.通过这个工具,可以先获取一个中文的拼音. public static String getLetter(String name) { StringBuilder sb = new StringBu

基本排序(四):索引指针排序、链表排序、关键字排序

1. 索引和指针排序 因为元素的数量或者数据量巨大等原因,我们不希望频繁移动要排序的元素.因此,不移动元素的排序方法是维持一个索引数组或者索引指针,而排序的目标就是重排索引数组或指针. 如: 初始化for(int i = 0; i < N; i++) a[i] = &data[i]; 使用间接比较#define less(A, B) (*A < *B) 使用下标或指针排序的主要原因是避免扰乱要排序的数据.我们可以对只读文件进行排序,或者针对一个文件的多个关键字进行排序. 另一个原因是避

普通索引的建立及普通索引的排序

本文为博主原创,转载请注明出处: 在实际应用索引时,在建表的同时建立索引,即在建表的sql中添加建立索引的sql,应用实例如下: CREATE TABLE tbl_camera_info ( `cameraId` varchar(64) NOT NULL COMMENT '镜头唯一编号,统一监控平台', `cameraName` varchar(128) NOT NULL COMMENT '镜头名称', `clientId` varchar(64) NOT NULL COMMENT '所属客户编

mysql之索引原理与慢查询优化

一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 2.为什么要有索引呢? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.

Mysql数据库索引

索引(Index)是帮助mysql高效获取数据的数据结构.对于高性能非常关键. 索引的重要性主要体现在数据量非常大的时候.规模小,负载轻的数据库即使没有索引也可以获到好的查询效果 例如: 1 mysql>select first_name from actor where actor_id=5; 改索引列位于actor_id列,因此mysql会使用索引找到actor_id为5的行. 索引有很多种类型,各自有各自的特点.索引实在存储引擎层实现的,而不是服务器层. (1).B-Tree索引 谈论引擎

MySQL— 索引

目录 一.索引 二.索引类型 三.索引种类 四.操作索引 五.创建索引的时机 六.命中索引 七.其它注意事项 八.LIMIT分页 九.执行计划 十.慢查询日志 一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引.组合索引

MongoDB学习笔记(索引)

一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({"username":1})    可以通过下面的名称查看索引是否已经成功建立:    > db.test.getIndexes()    删除索引的命令是:    > db.test.dropIndex({"username":1})    在MongoDB中,我们