我需要一个完整的c ++快速排序代码。 该部门希望以这种方式对数据进行排序:
请帮帮我。
我将总体保持为整数,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);
}
答案 0 :(得分:2)
不要自己写,请使用std::sort
。这将采用自定义排序顺序。从评论中,我了解到habitant::operator<
并未对geo_id
进行排序。这意味着您的自定义排序顺序功能首先检查a<b
和b<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()
函数的返回值,您决定是否交换算法。