如何按值排序数组(排序)? *扭曲*

我想使用C/C++按升序对数组进行排序。 结果是包含元素索引的数组。 每个索引都与排序数组中的元素位置相对应。

 Input: 1, 3, 4, 9, 6 Output: 1, 2, 3, 5, 4 

编辑:我正在使用shell排序程序。 基于哪个重复值首先在原始数组中任意选择重复值索引。

更新:

尽管我付出了最大的努力,但我还是无法为指针数组实现排序算法。 当前示例将无法编译。

有人可以告诉我有什么问题吗?

我非常感谢一些帮助!

 void SortArray(int ** pArray, int ArrayLength) { int i, j, flag = 1; // set flag to 1 to begin initial pass int * temp; // holding variable orig with no * for (i = 1; (i <= ArrayLength) && flag; i++) { flag = 0; for (j = 0; j  *pArray[j]) // ascending order simply changes to < { &temp = &pArray[j]; // swap elements &pArray[j] = &pArray[j + 1]; //the problem lies somewhere in here &pArray[j + 1] = &temp; flag = 1; // indicates that a swap occurred. } } } }; 

既然你正在使用C ++,我会这样做。 SortIntPointers函数可以是任何排序算法,重要的是它根据它们指向的int对指针数组进行排序。 完成后,您可以遍历指针数组并分配它们的排序索引,这些索引将最终位于原始数组中的原始位置。

 int* intArray; // set somewhere else int arrayLen; // set somewhere else int** pintArray = new int*[arrayLen]; for(int i = 0; i < arrayLen; ++i) { pintArray[i] = &intArray[i]; } // This function sorts the pointers according to the values they // point to. In effect, it sorts intArray without losing the positional // information. SortIntPointers(pintArray, arrayLen); // Dereference the pointers and assign their sorted position. for(int i = 0; i < arrayLen; ++i) { *pintArray[i] = i; } 

希望这很清楚。

好的,这是我在C ++中的尝试

 #include  #include  struct mycomparison { bool operator() (int* lhs, int* rhs) {return (*lhs) < (*rhs);} }; int main(int argc, char* argv[]) { int myarray[] = {1, 3, 6, 2, 4, 9, 5, 12, 10}; const size_t size = sizeof(myarray) / sizeof(myarray[0]); int *arrayofpointers[size]; for(int i = 0; i < size; ++i) { arrayofpointers[i] = myarray + i; } std::sort(arrayofpointers, arrayofpointers + size, mycomparison()); for(int i = 0; i < size; ++i) { *arrayofpointers[i] = i + 1; } for(int i = 0; i < size; ++i) { std::cout << myarray[i] << " "; } std::cout << std::endl; return 0; } 

创建一个新的数组,其值从0增加到n-1(其中n是要排序的数组的长度)。 然后根据新数组中的值索引的旧数组中的值对新数组进行排序。

例如,如果使用冒泡排序(易于解释),则不是比较新数组中的值,而是比较新数组中由新数组中的值索引的位置中的值:

 function bubbleRank(A){ var B = new Array(); for(var i=0; i A[B[i+1]]){ var temp = B[i]; B[i] = B[i+1]; B[i+1] = temp; swapped = true; } } }while(swapped); return B; } 

好吧,有一个trival n ^ 2解决方案。

在python中:

 newArray = sorted(oldArray) blankArray = [0] * len(oldArray) for i in xrange(len(newArray)): dex = oldArray.index(newArray[i]) blankArray[dex] = i 

根据列表的大小,这可能会有效。 如果你的列表很长,你需要做一些奇怪的并行数组排序,这看起来不是很有趣,并且是在代码中引入额外错误的快速方法。

另请注意,上面的代码假定oldArray中的唯一值。 如果不是这种情况,您需要进行一些后处理来解决绑定值。

使用boost :: lambda并行排序矢量…

  std::vector intVector; std::vector rank; // set up values according to your example... intVector.push_back( 1 ); intVector.push_back( 3 ); intVector.push_back( 4 ); intVector.push_back( 9 ); intVector.push_back( 6 ); for( int i = 0; i < intVector.size(); ++i ) { rank.push_back( i ); } using namespace boost::lambda; std::sort( rank.begin(), rank.end(), var( intVector )[ _1 ] < var( intVector )[ _2 ] ); //... and because you wanted to replace the values of the original with // their rank intVector = rank; 

注意:我使用vectorS而不是数组,因为它更清晰/更容易,我也使用C风格的索引,它从0开始计数,而不是1。

创建一个新数组并使用冒泡排序对元素进行排名

 int arr[n]; int rank[n]; for(int i=0;iarr[j]) rank[i]++; 

每个元素的等级将是rank [i] +1,其顺序为1,2,…. n

这是c语言的解决方案

 #include  void swap(int *xp, int *yp) { int temp = *xp; *xp = *yp; *yp = temp; } // A function to implement bubble sort void bubbleSort(int arr[], int n) { int i, j; for (i = 0; i < n - 1; i++) // Last i elements are already in place for (j = 0; j < n - i - 1; j++) if (arr[j] > arr[j + 1]) swap(&arr[j], &arr[j + 1]); } /* Function to print an array */ void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 98}; int arr_original[] = {64, 34, 25, 12, 22, 11, 98}; int rank[7]; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); //PLACE RANK //look for location of number in original array //place the location in rank array int counter = 1; for (int k = 0; k < n; k++){ for (int i = 0; i < n; i++){ printf("Checking..%d\n", i); if (arr_original[i] == arr[k]){ rank[i] = counter; counter++; printf("Found..%d\n", i); } } } printf("Original array: \n"); printArray(arr_original, n); printf("Rank array: \n"); printArray(rank, n); return 0; }