使用多个键快速排序?

时间:2017-10-31 07:49:57

标签: c++ quicksort

我需要一个完整的c ++快速排序代码。 该部门希望以这种方式对数据进行排序:

  1. 应根据人口对数据进行排序。
  2. 但是,如果两个居住地的居民人数相同,则应考虑geo_id。
  3. 如果两个部分都匹配,则代码应决定首先出现哪个住所。
  4. 请帮帮我。 我将总体保持为整数,geo_id string.swap()是我的变化函数。 对象是我的所有数据

    void habitant::quickSort(habitant& item,int left,int right){
    int i = left;
    int j = right;
    int pivot = item.c_population[(left + right) / 2];
    
    //partition
    while (i <= j) {
        while (item.c_population[i] < pivot)
            i++;
        while (item.c_population[j] > pivot)
            j--;
        if (i <= j) {
    
            swap(item.c_population[i], item.c_population[j]);
            swap(item.c_object[i], item.c_object[j]);
            swap(item.c_geo_id[i], item.c_geo_id[j]);
            i++;
            j--;
        }
    
    };
    
      //recursion
      if (left < j)
            quickSort(item, left, j);
      if (i < right)
            quickSort(item, i, right);
    }
    

2 个答案:

答案 0 :(得分:2)

不要自己写,请使用std::sort。这将采用自定义排序顺序。从评论中,我了解到habitant::operator<并未对geo_id进行排序。这意味着您的自定义排序顺序功能首先检查a<bb<a。如果两者都为假,则返回a.geo_id < b.geo_id

(排序顺序函数或谓词需要对两个参数进行排序并返回true 当且仅当第一个参数在第二个参数之前排序时)

答案 1 :(得分:0)

在您的代码中,您根据人口对居民进行排序,您的要求是 - 如果人口相等,则根据 geo_id 。在您的代码中,您有:

while (item.c_population[i] < pivot)

while (item.c_population[j] > pivot)

在这里,您只考虑人口来对项目列表进行排序,因此,您将根据人口对列表进行排序,这很明显。< / p>

要解决您的问题,您需要考虑多个标准进行比较。最好的方法是编写function进行比较,并在快速排序算法中使用该函数。 该功能应该有多个条件用于排序,在您的情况下,多个条件将是人口(主要标准)和geo_id(次要标准)

这样的事情(下面的函数只是一个示例函数来解释你和你的要求,这可能完全不同):

int compare (habitant& item1, habitant& item2) {
    if (item.population < item2.population)
            return -1;      // item1 is smaller than item 2
    else if (item.population > item2.population)
            return 1;       // item 1 is bigger than item 2
    else if (item1.geo_id < item2.geo_id)
            return -1;      // item1 is smaller than item 2
    else if ((item1.geo_id > item2.geo_id)
            return 1;       // item 1 is bigger than item 2
    else
            return 0;       // both the items are same
}

根据compare()函数的返回值,您决定是否交换算法。