user-0 提问: 请教数组升序排序后原来的索引

回复:
user: user-1
content: 仅供参考 /*************************************************************************     > File Name: qsort_2.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月22日 星期六 10时24分16秒  ************************************************************************/  #include<stdio.h> struct node { 	int date; 	int No; }; int comp(void *a,void *b) { 	return (*(struct node *)a).date - (*(struct node *)b).date; } int main() { 	int a[] = {3,4,2,5,7,6,1,8,4,2}; 	int n = sizeof(a)/sizeof(int); 	struct node arry[n]; 	int i; 	for(i = 0; i < n;++i) 	{ 		arry[i].date = a[i]; 		arry[i].No = i; 	} 	qsort(arry,n,sizeof(struct node),comp); 	printf("(当前值，原索引)\n"); 	for(i = 0; i < n;++i) 	{ 		printf("(%4d  , %4d )\n",arry[i].date,arry[i].No); 	} 	return 0; }

user: user-2
content: void psort(int a[],int n, int b[] ) {     int i,j,temp;     for(j = 0;j<n-1;j++) 	{ 		b[j] = j;         for(i = j+1;i<n;i++)         {             if(a[j] > a[i])             {                 temp = a[j];                 a[j] = a[i];                 a[i] = temp; 				b[j] = i;             }         } 	} }

user: user-0
content: 引用 7 楼 xionggch 的回复: void psort(int a[],int n, int b[] ) {     int i,j,temp;     for(j = 0;j<n-1;j++) 	{ 		b[j] = j;         for(i = j+1;i<n;i++)         {             if(a[j] > a[i])             {                 temp = a[j];                 a[j] = a[i];                 a[i] = temp; 				b[j] = i;             }         } 	} }   这个代码想法差不多，但是结果不对。 我自己已经写出来了，发出来看看吧：   int Sort_index(float * pInArray, int * pOutIndex, int nLen) //ascending sequence { 	int **pAr; 	int first_address; 	int i, j;   	int *ptemp;  	pAr = (int **)malloc(sizeof(int*)*nLen); 	for(i=0;i<nLen;i++) 		pAr[i] = (int *)(&pInArray[i]);  	first_address = (int)pAr[0];  	for (i = 0; i < nLen; i++)   	{   	    for (j = 0; j < nLen - i - 1; j++) 		{ 			if (*pAr[j] > *pAr[j + 1])   	        {   	            ptemp = pAr[j]; 				pAr[j] = pAr[j+1]; 				pAr[j+1] = ptemp; 	        }  		} 	}    	for(i=0;i<nLen;i++) 		pOutIndex[i] = ((int)pAr[i] - first_address)/sizeof(float);  	free(pAr); 	return 1;    }

user: user-3
content: 引用 4 楼 dpstill 的回复:[quote=引用 2 楼 ri_aje 的回复:] 直接排序索引就行了。   高手，有c代码吗？贴一下代码看看。。[/quote] 没有。c++ 的要吗

user: user-4
content: #include"stdafx.h" #include <iostream> #include <vector> #include <map> using namespace std; map<int,int> indexvalue; map<int,int> valuecount; map<int,int>::iterator it; void psort(int a[],int n) { 	int i,j,temp; 	for(j = 0;j<n-1;j++) 		for(i = 0;i<n-1-j;i++) 		{ 			if(a[i] > a[i+1]) 			{ 				temp = a[i]; 				a[i] = a[i+1]; 				a[i+1] = temp; 			} 		} }  int main() { 	int a[] = {3,4,2,5,7,6,1,8,4,2};	 	for(int i = 0 ;i < sizeof(a)/sizeof(a[0]);i++) 	{	 		indexvalue.insert(make_pair(i,a[i])); 		it = valuecount.find(a[i]); 		if(it != valuecount.end()) 			valuecount[a[i]]++; 		else 		{ 			valuecount.insert(make_pair(a[i],i)); 			valuecount[a[i]]=1; 		} 	} 	psort(a,10); 	int icount; 	for(int i = 0 ;i < sizeof(a)/sizeof(a[0]);) 	{ 		for(it = indexvalue.begin();it!=indexvalue.end();it++) 		{ 			if(it->second == a[i]) 			{ 				icount = valuecount[a[i]]; 				cout<<it->second<<" "<<it->first<<endl; 			} 			 		}i+=icount; 	} 	return 0;	 }

user: user-0
content: 引用 2 楼 ri_aje 的回复:直接排序索引就行了。   高手，有c代码吗？贴一下代码看看。。

user: user-0
content: 引用 1 楼 user-4 的回复:排序前 对a数组做个备份  排序后在备份数组找新数组元素 记录位置  如果数组中有些数相等，用这个方法就不是很好。

user: user-3
content: 直接排序索引就行了。

user: user-4
content: 排序前 对a数组做个备份  排序后在备份数组找新数组元素 记录位置