降序稳定排序


在本文中,我们将讨论稳定排序的含义以及如何在保持排序算法稳定性的前提下将数组按降序排序。

让我们首先讨论稳定排序算法的特征。

排序算法如果在排序时保留输入数据中具有相同值的项目的原始顺序,则称为稳定的。因此,如果存在两个或多个具有相同值的项目,则稳定排序算法不会更改它们在排序输出中的相对位置。

稳定排序算法在处理诸如记录之类的复杂数据结构时非常有用,在这些数据结构中,维护具有相同值的项目的原始顺序至关重要。这是因为稳定排序算法确保具有相等值的项目在排序输出中保持其原始顺序。可以在此类场景中使用的一些稳定排序算法示例包括合并排序、插入排序和冒泡排序。

问题陈述

分配给我们一个包含 n 个元素的数组,我们必须以降序对给定数组进行排序,以使在排序时保留输入数据中具有相同值的项目的原始顺序。

Input: Nums [] = { 5, 3, 1, 3, 2 }

如果我们使用稳定排序算法以降序对给定数组 nums 进行排序,则获得的数组为:

Result: { 5, 3, 3, 2, 1 }

解决此问题的一种方法可能是实现用于降序的冒泡排序。

示例

此方法的代码如下所示:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void sort(vector<int>&nums, int size){
   for (int iterator = size ; iterator >= 0; iterator--)
      for (int it = size ; it > size - iterator ; it--)
         if (nums[it] > nums[it - 1])
            swap(nums[it] , nums[it-1]);
}
int main(){
   vector<int> numbers = { 5, 3, 1, 3, 2  };
   sort(numbers, 5);
   cout<<" The given array after sorting in descending order using Stable sort method is: "<< endl;
   for (int iterator = 0; iterator < numbers.size(); ++iterator) {
      cout<<  numbers[iterator] << " ";
   }
   return 0;
}

输出

The given array after sorting in descending order using Stable sort method is: 
5 3 3 2 1

示例

使用合并排序实现

众所周知,稳定排序也可以使用合并排序方法完成,下面给出了另一种使用合并排序的实现:

代码如下:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

// this function is used to sort the array
void merge( vector<int>& nums, int left, int midelement, int temp) {
   vector<int> temparr(temp - left + 1);
   int iterator = left, j = midelement + 1, k = 0;
    
   while (iterator <= midelement && j <= temp) {
      if (nums[iterator] >= nums[j]) {
         temparr[k++] = nums[iterator++];
      } else {
         temparr[k++] = nums[j++];
      }
   }    
   while (iterator <= midelement){
      temparr[k++] = nums[iterator++];
   }    
   while (j <= temp){
      temparr[k++] = nums[j++];
   }    
   for (int p = 0; p < k; ++p) {
      nums[left + p] = temparr[p];
   }
}
void m_sort_helper( vector<int>& nums, int l, int t ) {
   if (l < t) {
      int midelement = (l + t) / 2;
      m_sort_helper ( nums, l, midelement );
      m_sort_helper( nums, midelement + 1, t );
      merge( nums, l, midelement, t );
   }
}
void merge_sort( vector<int>& nums ){
   m_sort_helper(nums, 0, nums.size() - 1);
}
int main() {
   vector<int> nums = {5, 3, 1, 3, 2};
   merge_sort( nums );
   cout<<" The given array after sorting in descending order using Stable sort method is: "<< endl;
   for (int iterator = 0; iterator < nums.size(); ++iterator ) {
      cout << nums[ iterator ] << " ";
   }
   return 0;
}

输出

The given array after sorting in descending order using Stable sort method is: 
5 3 3 2 1

示例

使用内置库函数

稳定排序也可以使用内置库函数执行。

std::stable_sort 是 C++ 中的一个函数,可用于对容器(如向量或数组)中的元素进行排序。该函数以稳定的方式对元素进行排序,这意味着相等元素在排序过程完成后会保留其相对顺序。

该函数接受三个参数:要排序的容器的开始和结束迭代器,以及定义排序顺序的比较函数。您可以使用它来按升序或降序对元素进行排序。

此方法的代码如下所示:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
   std::vector<int> nums = {5, 3, 1, 3, 2};
   std::stable_sort(nums.begin(), nums.end(), std::greater<int>());
   cout<<" The given array after sorting in descending order using Stable sort method is: "<< endl;
   for (int num : nums) {
      std::cout << num << " ";
   }    
   return 0;
}

输出

The given array after sorting in descending order using Stable sort method is: 
5 3 3 2 1

结论

在本文中,我们讨论了可以执行稳定排序操作的不同方法,包括以降序执行稳定排序的方法,我们还了解了稳定排序以及为什么以稳定顺序对数组进行排序很重要。

更新于: 2023年10月5日

183 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告