泛型排序算法原理以及实现,基于函数模板【c++与golang】【万字总结】

本文介绍了使用C++和Go语言实现的通用排序算法模板,包括插入排序、冒泡排序、选择排序、归并排序、快速排序和堆排序。这些模板支持不同类型的数组,并通过比较函数实现自定义排序规则。文章详细阐述了每种排序算法的步骤和C++及Go语言的实现代码,同时对比了六种排序算法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

排序算法是计算机程序中常用的一种算法,它可以将一个无序的数据集合按照某种规则重新排列,使其变为有序的数据集合。
本文实现了基于模板的排序算法,这样的话使用与任何场合,任何类型的数组。c++与go实现

一、排序算法模板的定义以及使用

c++实现

以冒泡排序为例子。函数模板支持两种类型的参数:vector& arr 和 Compare cmp。vector& arr 表示待排序的数组,cmp表示比较函数,它的功能是判断两个对象(这里是vector类型)与给定的规则是否满足关系: 如果a在b之前,返回true;否则返回false。第一个参数cmp的类型为typename Compare,表示比较函数,第二个参数T& arr的类型为typename T,表示要排序的数组类型。

template<typename T,typename Compare>
void bubble_sort(vector<T> & arr,Compare cmp){
   
    //排序算法部分
    int n=arr.size();
    for(int i=0;i<n-1;i++){
   
         for (int j = 0; j < n - i - 1; ++j) {
   
            if (!cmp(arr[j], arr[j+1])) {
   
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

使用起来也很简单。比如说要字典权值排序。


vector<string> v{
   "小明","小亮","小东","小西","小丽"};
map<string,int> m;
m["小明"]=90;
m["小亮"]=70;
m["小东"]=80;
m["小西"]=50;
m["小丽"]=60;
bubble_sort(v,  [&](string a,  string b){
   
return m[a] > m[b];
 });

go语言

go语言实现中我们首先定义了一个 BubbleSort 函数,使用 [T any] 来声明一个泛型类型 T,并传入一个泛型切片 arr 和一个比较函数 cmp。在函数内部,我们使用泛型类型 T 和比较函数 cmp 来进行元素的比较和交换。

package main

import (
	"fmt"
)

// 泛型冒泡排序算法
func BubbleSort[T any](arr []T, cmp func(T, T) bool) {
   
	n := len(arr)
	for i := 0; i < n-1; i++ {
   
		for j := 0; j < n-i-1; j++ {
   
			if !cmp(arr[j], arr[j+1]) {
   
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
}

// 测试代码
func main() {
   
	v := []string{
   "小明", "小亮", "小东", "小西", "小丽"}
	m := map[string]int{
   
		"小明": 90,
		"小亮": 70,
		"小东": 80,
		"小西": 50,
		"小丽": 60,
	}
	fmt.Println("Before sorting:", v)
	BubbleSort(v, func(a, b string) bool {
   
		return m[a] > m[b]
	})
	fmt.Println("After sorting:", v)
}

1、插入排序

插入排序是一种简单直观的排序算法,它的原理是将待排序的元素逐个插入到已排序的序列中,形成一个有序的序列。在实现插入排序时,我们需要通过比较和交换元素的位置来完成排序过程。过程如下图所示:
请添加图片描述

步骤详解

插入排序算法的原理可以描述为以下几个步骤:

1、将第一个元素视为已排序序列。
2、从第二个元素开始,逐个将待排序的元素插入已排序序列的合适位置。
3、每次插入之后,已排序序列的长度增加一个元素,直到所有元素都被插入完毕。

具体来说,假设我们有一个待排序的序列 arr,它包含 n 个元素。我们将第一个元素 arr[0] 视为已排序序列,然后从第二个元素 arr[1] 开始,逐个将待排序的元素插入已排序序列中。
在插入的过程中,我们需要将待排序元素与已排序序列中的元素进行比较,找到合适的位置插入。如果待排序元素小于已排序序列中的某个元素,就将该元素后移,为待排序元素腾出位置。依此类推,直到找到待排序元素的合适位置,然后将其插入。

c++实现

c++函数中的变量 n 表示向量的大小,循环从第二个元素开始遍历。在每次循环中,我们将待排序元素 arr[i] 存储在变量 key 中,并将索引值 j 初始化为 i - 1。
接下来,通过一个 while 循环来找到待排序元素的合适位置。循环条件为 j >= 0(确保不越界)且 !cmp(arr[j], key)(待排序元素不小于已排序序列中的元素)。在循环中,我们将已排序序列中的元素逐个后移,直到找到合适的位置。
最后,将待排序元素插入到 arr[j + 1] 的位置,完成一次插入操作。重复上述步骤,直到所有元素都被插入完毕,整个向量就被排序完成。

template<typename T, typename Compare>
void insertion_sort(vector<T>& arr, Compare cmp) {
   
    int n = arr.size();
    for (int i = 1; i < n; i++) {
   
        T key = arr[i];
        int j = i - 1;
        while (j >= 0 && !cmp(arr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值