文章目录
前言
排序算法是计算机程序中常用的一种算法,它可以将一个无序的数据集合按照某种规则重新排列,使其变为有序的数据集合。
本文实现了基于模板的排序算法,这样的话使用与任何场合,任何类型的数组。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