在保持重复项的同时进行排序

Sort while keeping duplicates together

本文关键字:排序      更新时间:2023-10-16

>我有三个向量

vector<string> a_words0(75000);
vector<string> a_words1(75000);
vector<string> a_words2(75000);

下面考虑同一行的元素的外观:

.
.
.
It's    raining  outside
The     warrior  is
It's    raining  heavily
It's    raining  outside
.
.
.

正在使用快速排序功能根据第一个向量进行排序,它给了我以下结果

.
.
.
It's    raining  outside
It's    raining  heavily
It's    raining  outside
The     warrior  is
.
.
.

问题是我希望重复项像这样在一起:

.
.
.
It's    raining  outside
It's    raining  outside
It's    raining  heavily
The     warrior  is
.
.
.

这是我的快速排序功能:

void quicksort(vector<string> &arr0, vector<string> &arr1,vector<string> &arr2,int low, int high)
{
int i = low;
int j = high;
string y = "Z";
/* compare value */
string z = arr0[(low + high) / 2];
/* partition */
do {
    /* find member above ... */
    while(arr0[i] < z) i++;
    /* find element below ... */
    while(arr0[j] > z) j--;
    if(i <= j) {
        /* swap two elements */
        y = arr0[i];
        arr0[i] = arr0[j]; 
        arr0[j] = y;
        y = arr1[i];
        arr1[i] = arr1[j]; 
        arr1[j] = y;
        y = arr2[i];
        arr2[i] = arr2[j]; 
        arr2[j] = y;
        i++; 
        j--;
    }
} while(i <= j);

/* recurse */
if(low < j) 
    quicksort(arr0,arr1,arr2, low, j);
if(i < high) 
    quicksort(arr0,arr1,arr2, i, high); 
}

您可以更改比较以比较 arr0 的两个元素,如果相同,则比较 arr1 的两个元素,如果仍然相同,则比较 arr2 的两个元素。您可以考虑将 Y 的名称更改为 T(表示临时),然后使用 X、Y、Z 作为 arr0、arr1 和 arr2 的枢轴点。

快速排序不稳定,因此不能使用从最不重要到最重要的多个排序传递。您可以使用 std::stable_sort()(通常实现为合并排序),并再次使用自定义比较,如果需要,比较 arr0、arr1 和 arr2,或者先按 arr2,然后按 arr1,然后按 arr0 对数据进行 3 次排序。