7种数组排序算法(多语言描述)

912. 排序数组

冒泡排序

C++

void bubble_sort(vector<int>& nums) {
    bool sorted = false;
    int N = nums.size();
    while (!sorted) {
        sorted = true;
        for (int i = 1; i < N; i++) {
            if (nums[i - 1] > nums[i]) {
                swap(nums[i - 1], nums[i]);
                sorted = false;
            }
        }
        N--;
    }
}

Python

def bubble_sort(nums):
    N = len(nums)
    sorted = False
    while not sorted:
        sorted = True
        for i in range(1, N):
            if nums[i - 1] > nums[i]:
                nums[i - 1], nums[i] = nums[i], nums[i -1]
                sorted = False
        N -= 1

Golang

func bubbleSort(nums []int) {
    N := len(nums)
    sorted := false
    for !sorted {
        sorted = true
        for i := 1; i < N; i++ {
            if nums[i - 1] > nums[i] {
                sorted = false
                nums[i - 1], nums[i] = nums[i], nums[i - 1]
            }
        }
        N--
    }
}

Rust

fn bubble_sort(nums: &mut Vec<i32>) {
    let mut sorted = false;
    let mut N = nums.len();
    while !sorted {
        sorted = true;
        for i in 1..N {
            if nums[i - 1] > nums[i] {
                nums.swap(i - 1, i);
                sorted = false;
            }
        }
        N -= 1;
    }
}

插入排序

C++

void insertion_sort(vector<int>& nums) {
    int t = 0, i = 1, j = 0;
    for (i = 1; i < nums.size(); i++) {
        t = nums[i];
        for (j = i; j > 0 && nums[j - 1] > t; j--) {
            nums[j] = nums[j - 1];
        }
        nums[j] = t;
    }
}

Python

def insertion_sort(nums):
    for i in range(1, len(nums)):
        t = nums[i]
        j = i
        while j > 0 and nums[j - 1] > t:
            nums[j] = nums[j - 1]
            j -= 1
        nums[j] = t

Golang

func insertionSort(nums []int) {
    for i := 1; i < len(nums); i++ {
        t := nums[i]
        j := i
        for j > 0 && nums[j - 1] > t {
            nums[j] = nums[j - 1]
            j--
        }
        nums[j] = t
    }
}

Rust

fn insertion_sort(nums: &mut Vec<i32>) {
    for i in 1..nums.len() {
        let t = nums[i];
        let mut j = i;
        while j > 0 && nums[j - 1] > t {
            nums[j] = nums[j - 1];
            j -= 1;
        }
        nums[j] = t;
    }
}

希尔排序

希尔排序作为插入排序的一种改进,又被称为缩小增量排序,其每次进行增量为 d 的插入排序,d /= 2 向下递减到 1

C++

void shell_sort(vector<int>& nums) {
    int N = nums.size(), d = N >> 1, i = 0, j = 0, t = 0;
    for (; d > 0; d >>= 1) {
        for (i = d; i < N; i++) {
            t = nums[i];
            for (j = i; j >= d && nums[j - d] > t; j -= d) {
                nums[j] = nums[j - d];
            }
            nums[j] = t;
        }
    }
}

Python

def shell_sort(nums):
    N = len(nums)
    d = N >> 1
    while d > 0:
        for i in range(d, N):
            t = nums[i]
            j = i
            while j >= d and nums[j - d] > t:
                nums[j] = nums[j - d]
                j -= d
            nums[j] = t
        d >>= 1

Golang

func shellSort(nums []int) {
    N := len(nums)
    d := N >> 1
    for ; d > 0; d >>= 1 {
        for i := d; i < N; i++ {
            t := nums[i]
            j := i
            for ; j >= d && nums[j - d] > t; j -= d {
                nums[j] = nums[j - d]
            }
            nums[j] = t
        }
    }
}

Rust

fn shell_sort(nums: &mut Vec<i32>) {
    let N = nums.len();
    let mut d = N >> 1;
    while d > 0 {
        for i in d..N {
            let t = nums[i];
            let mut j = i;
            while j >= d && nums[j - d] > t {
                nums[j] = nums[j - d];
                j -= d;
            }
            nums[j] = t;
        }
        d >>= 1;
    }
}

选择排序

C++

int findMin(vector<int>& nums, int l, int r) {
    int min = nums[l], min_pos = l;
    for (int i = l; i <= r; i++ ) {
        if (nums[i] < min) {
            min = nums[i];
            min_pos = i;
        }
    }
    return min_pos;
}

void selectSort(vector<int>& nums) {
    int N = nums.size();
    for (int i = 0; i < N; i++) {
        int min_pos = findMin(nums, i, N - 1);
        swap(nums[i], nums[min_pos]);
    }
}

Python

def findMin(nums, l, r):
    m = nums[l]
    m_pos = l
    for i in range(l, r + 1):
        if nums[i] < m:
            m = nums[i]
            m_pos = i
    return m_pos


def selectSort(nums):
    N = len(nums)
    for i in range(0, N):
        min_pos = findMin(nums, i, N - 1)
        nums[i], nums[min_pos] = nums[min_pos], nums[i]

Golang

func findMin(nums []int, l int, r int) int {
    m := nums[l]
    mp := l
    for i := l; i <= r; i++ {
        if nums[i] < m {
            m = nums[i]
            mp = i
        }
    }
    return mp
}

func selectSort(nums []int) {
    N := len(nums)
    for i := 0; i < N; i++ {
        mp := findMin(nums, i, N - 1)
        nums[i], nums[mp] = nums[mp], nums[i]
    }
}

Rust

fn find_min(nums: &Vec<i32>, l: usize, r: usize) -> usize {
    let mut m = nums[l];
    let mut mp = l;     // min position
    for i in l..(r + 1) {
        if nums[i] < m {
            m = nums[i];
            mp = i;
        }
    }
    mp
}

fn select_sort(nums: &mut Vec<i32>) {
    let N = nums.len();
    for i in 0..N {
        let mp = find_min(nums, i, N - 1);
        nums.swap(i, mp);
    }
}

堆排序

C++

void percolate(vector<int>& nums, int i, int N) {
    int p = i;
    int top = nums[i];
    int c = 0;
    while (p * 2 + 1 < N) {
        c = p * 2 + 1;
        if (c < N - 1 && nums[c + 1] > nums[c]) {
            c++;
        }
        if (nums[c] <= top) {
            break;
        } else {
            nums[p] = nums[c];
        }
        p = c;
    }
    nums[p] = top;
}

void heap_sort(vector<int>& nums) {
    int N = nums.size();
    int i = 0;
    for (i = N / 2; i >= 0; i--) {
        percolate(nums, i, N);
    }

    for (i = N - 1; i > 0; i--) {
        swap(nums[i], nums[0]);
        percolate(nums, 0, i);
    }
}

Python

def percolate(nums, i, N):
    p = i
    top = nums[i]
    c = 0
    while p * 2 + 1 < N:
        c = p * 2 + 1
        if c + 1 < N and nums[c + 1] > nums[c]:
            c += 1
        if nums[c] <= top:
            break
        else:
            nums[p] = nums[c]
        p = c
    nums[p] = top


def heap_sort(nums):
    N = len(nums)
    for i in range(N >> 1, -1, -1):
        percolate(nums, i, N)
    for i in range(N - 1, 0, -1):
        nums[0], nums[i] = nums[i], nums[0]
        percolate(nums, 0, i)

Golang

func percolate(nums []int, i int, N int) {
    p := i
    top := nums[i]
    c := 0
    for p * 2 + 1 < N {
        c = p * 2 + 1
        if c + 1 < N && nums[c + 1]  > nums[c] {
            c++
        }
        if top >= nums[c] {
            break
        } else {
            nums[p] = nums[c]
        }
        p = c
    }
    nums[p] = top
}

func heapSort(nums []int) {
    N := len(nums)
    for i := N >> 1; i >= 0; i-- {
        percolate(nums, i, N)
    }
    for i := N - 1; i > 0; i-- {
        nums[0], nums[i] = nums[i], nums[0]
        percolate(nums, 0, i)
    }
}

Rust

fn percolate(nums: &mut Vec<i32>, i: usize, N: usize) {
    let mut p = i;
    let top = nums[i];
    let mut c = 0;
    while p * 2 + 1 < N {
        c = p * 2 + 1;
        if c + 1 < N && nums[c + 1] > nums[c] {
            c += 1;
        }
        if top >= nums[c] {
            break;
        } else {
            nums[p] = nums[c];
        }
        p = c
    }
    nums[p] = top;
}

fn heap_sort(nums: &mut Vec<i32>) {
    let N = nums.len();
    for i in (0 as usize..(N >> 1) + 1).rev() {
        percolate(nums, i, N);
    }
    for i in (0..N).rev() {
        nums.swap(0, i);
        percolate(nums, 0, i);
    }
}

归并排序

C++

void merge(vector<int>& nums, int low, int mid, int high) {
    auto it = nums.begin();
    vector<int> L(it + low, it + mid + 1);
    vector<int> R(it + mid + 1, it + high + 1);
    int i = 0, j = 0, k = low;
    while (i < L.size() && j < R.size()) {
        if (L[i] <= R[j]) {
            nums[k++] = L[i++];
        } else {
            nums[k++] = R[j++];
        }
    }
    while (i < L.size()) nums[k++] = L[i++];
    while (j < R.size()) nums[k++] = R[j++];
}

void mergesort(vector<int>& nums, int low, int high) {
    if (low < high) {
        int mid = (low + high) >> 1;
        mergesort(nums, low, mid);
        mergesort(nums, mid + 1, high);
        merge(nums, low, mid, high);
    }
}

Python

def merge(nums, l, mid, r):
    left = nums[l: mid + 1]
    right = nums[mid + 1: r + 1]
    i, j, k = 0, 0, l
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            nums[k] = left[i]
            i += 1
        else:
            nums[k] = right[j]
            j += 1
        k += 1
    while i < len(left):
        nums[k] = left[i]
        k += 1
        i += 1
    while j < len(right):
        nums[k] = right[j]
        k += 1
        j += 1

def merge_sort(nums, l, r):
    if l < r:
        mid = (l + r) >> 1
        merge_sort(nums, l, mid)
        merge_sort(nums, mid + 1, r)
        merge(nums, l, mid, r)

Golang

func merge(nums []int, low int, mid int, high int) {
    L := make([]int, mid - low + 1)
    R := make([]int, high - mid)
    copy(L, nums[low: mid + 1])
    copy(R, nums[mid + 1: high + 1])
    i, j, k := 0, 0, low
    for i < len(L) && j < len(R) {
        if L[i] <= R[j] {
            nums[k] = L[i]
            i++
        } else {
            nums[k] = R[j]
            j++
        }
        k++
    }
    for i < len(L) {
        nums[k] = L[i]
        k++
        i++
    }
    for j < len(R) {
        nums[k] = R[j]
        k++
        j++
    }
}

func mergesort(nums []int, low int, high int) {
    if low < high {
        mid := (low + high) >> 1
        mergesort(nums, low, mid)
        mergesort(nums, mid + 1, high)
        merge(nums, low, mid, high)
    }
}

Rust

fn merge(nums: &mut Vec<i32>, l: usize, mid: usize, r: usize) {
    let it = nums.iter();
    let L: Vec<i32> = it.clone().skip(l).take(mid - l + 1).map(|&x| x).collect();
    let R: Vec<i32> = it.clone().skip(mid + 1).take(r - mid).map(|&x| x).collect();

    let mut i = 0;
    let mut j = 0;
    let mut k = l;
    while i < L.len() && j < R.len() {
        if L[i] <= R[j] {
            nums[k] = L[i];
            i += 1;
        } else {
            nums[k] = R[j];
            j += 1;
        }
        k += 1;
    }
    while i < L.len() {
        nums[k] = L[i];
        i += 1;
        k += 1;
    }
    while j < R.len() {
        nums[k] =R[j];
        j += 1;
        k += 1;
    }
}

fn merge_sort(nums: &mut Vec<i32>, l: usize, r: usize) {
    if l < r {
        let mid = (l + r) >> 1;
        merge_sort(nums, l, mid);
        merge_sort(nums, mid + 1, r);
        merge(nums, l, mid, r);
    }
}

快速排序

naive 实现1(消耗额外空间)

在这里插入图片描述
消耗额外的空间,但思路最简单

Golang

func quicksort(nums []int) []int {
	if len(nums) < 2 {
		return nums
	}
	pivot := nums[0]
	var left, right []int
	for _, e := range nums[1:] {
		if e <= pivot {
			left = append(left, e)
		} else {
			right = append(right, e)
		}
	}
	return append(quicksort(left), append([]int{pivot}, quicksort(right)...)...)
}

Python

def quicksort(nums):
    l = len(nums)
    if l < 2:
        return nums

    p = nums[0]
    left, right = [], []
    for n in nums[1:]:
        if n <= p:
            left.append(n)
        else:
            right.append(n)
    return quicksort(left) + [p] + quicksort(right)

js

function quicksort(nums) {
    let l = nums.length;
    if (l < 2) return nums;
    let pivot = nums[0];
    let left = [], right = [];
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] <= pivot) {
            left.push(nums[i]);
        } else {
            right.push(nums[i]);
        }
    }
    return [...quicksort(left), pivot, ...quicksort(right)];
}

naive 实现2(借助 partition)

Python

def partition(nums, l, r):
    pivot = nums[l]
    while l < r:
        while l < r and pivot <= nums[r]:
            r -= 1
        nums[l] = nums[r]
        while l < r and pivot >= nums[l]:
            l += 1
        nums[r] = nums[l]
    nums[l] = pivot
    return l

def quicksort(nums, l, r):
    if (l < r):
        p = partition(nums, l, r)
        quicksort(nums, l, p - 1)
        quicksort(nums, p + 1, r)

C++

int partition(vector<int>& nums, int l, int r) {
    int pivot = nums[l];
    while (l < r) {
        while (l < r && nums[r] >= pivot) r--;
        nums[l] = nums[r];
        while (l < r && nums[l] <= pivot) l++;
        nums[r] = nums[l];
    }
    nums[l] = pivot;
    return l;
}

void quicksort(vector<int>& nums, int l, int r) {
    if (l < r) {
        int p = partition(nums, l, r);
        quicksort(nums, l, p - 1);
        quicksort(nums, p + 1, r);
    }
}

naive 实现3(额外消耗空间+随机选主元)

rand.Seed(time.Now().UnixNano())

func quicksort(nums []int) []int {
    l := len(nums)
	if l < 2 {
		return nums
	}
	p := rand.Intn(l)
	pivot := nums[p]

	var left, right []int
	for i, e := range nums {
        if i == p {
            continue
        }
		if e <= pivot {
			left = append(left, e)
		} else {
			right = append(right, e)
		}
	}
	return append(quicksort(left), append([]int{pivot}, quicksort(right)...)...)
}

标准模板(简洁可AC)

C++

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

Rust

pub fn quicksort(nums: &mut Vec<i32>, l: usize, r: usize) {
    if l >= r {
        return;
    }
    let mut i = l as isize - 1;
    let mut j = r as isize + 1;
    let x = nums[(l + r) >> 1];
    
    while i < j {
        loop {
            i += 1;
            if nums[i as usize] >= x {
                break;
            }
        }
        loop {
            j -= 1;
            if nums[j as usize] <= x {
                break;
            }
        }
        if i < j {
            nums.swap(i as usize, j as usize);
        }
    }
    Self::quicksort(nums, l, j as usize);
    Self::quicksort(nums, j as usize + 1, r);
}

Python

def quicksort(nums, l, r):
    if l >= r:
        return
    i, j = l - 1, r + 1
    x = nums[(l + r) >> 1]
    while i < j:
        i += 1
        while nums[i] < x:
            i += 1
        j -= 1
        while nums[j] > x:
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]
    quicksort(nums, l, j)
    quicksort(nums, j + 1, r)

Golang

func quicksort(nums []int, l int, r int) {
    if l >= r {
        return
    }
    i := l - 1
    j := r + 1
    x := nums[(l + r) >> 1]
    for i < j {
        for i++; nums[i] < x; i++ {}
        for j--; nums[j] > x; j-- {}
        if i < j {
            nums[i], nums[j] = nums[j], nums[i]
        }
    }
    quicksort(nums, l, j)
    quicksort(nums, j + 1, r)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TinyEMU编译与使用(一)

TinyEMU编译与使用&#xff08;一&#xff09; 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于…

OpenHarmony下musl编译工具链普法

OpenHarmony下musl编译工具链普法 引言 欠的债总是要还的&#xff0c;这不前面欠的关于OpenHarmony下musl相关的还是要还的。这里我对其中的相关知识点&#xff0c;梳理&#xff0c;归纳重新消化下&#xff01; 一.GCC/Clang/LLVM的区别与联系 说实话&#xff0c;这块我现在都…

基于springboot的月度员工绩效考核管理系统论文

摘 要 科学时代的发展改变了人类的生活&#xff0c;促使网络与计算机技术深入人类的各个角落&#xff0c;得以普及到人类的具体生活中&#xff0c;为人类的时代文明掀开新的篇章。本系统为月度员工绩效考核管理系统&#xff0c;是专为企业开发的对员工考核的协助软件。可以帮助…

video视频播放

1.列表页面 <template><div><ul><li class"item" v-for"(item,index) in list" :key"index" click"turnPlay(item.videoUrl)"><img :src"item.img" alt""><div class"btn…

教资截流,值得一做的项目

从去年9月份开始&#xff0c;教资这个类目基本上就成熟了&#xff0c;所以截流就出来了。 有流量的地方&#xff0c;就有截流。 12月教资截流&#xff0c;值得一做的项目 截流万变不离其宗&#xff0c;就是去别人有流量的文章或者视频下面截流。 我记得今年7月的时候&#xff…

K线实战分析系列之二十一:三星形态——罕见的反转信号

K线实战分析系列之二十一&#xff1a;三星形态——罕见的反转信号 一、三星形态二、三星形态总结 一、三星形态 二、三星形态总结 三星形态由三根十字线组成&#xff0c;是反转信号&#xff0c;在行情阶段性的顶部或者是底部出现典型的三星形态中间的十字线收盘价高于前一根和…

Docker实战——使用 Docker Compose 进行服务编排

目录 安装配置 Docker Compose方法一&#xff1a;方法二&#xff1a; 进行服务编排使用手动方式部署应用1、使用 Python 创建 Web 应用&#xff08;创建文件“app.py”&#xff09;&#xff0c;文件内容如下&#xff1a;2、创建 “requirements.txt” 文件&#xff0c;由于在应…

根据关键词过滤内容

package com.example.test.utils;import java.util.*;/*** Author leo* Date 2024/3/6 10:41* description: 敏感词工具类* Title: MgcUtils* Package org.jeecg.modules.yygl.dbwgl*/ public class MgcUtils {private static Map<String, Object> dictionaryMap null;p…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是&#xff0c;能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发&#xff0c;就必须依赖远程版本库。远程版本库允许&#xff0c;我们将本地版本库保存在远端服务器&#xff0c;而且&#xff0c;不同的开发者也是基于远程版本…

算法Day04_203.移除链表元素

推荐阅读 算法day01_ 27. 移除元素、977.有序数组的平方 算法day02_209.长度最小的子数组 算法day03_ 59.螺旋矩阵II 目录 推荐阅读203.移除链表元素题目思路解法暴力解法虚拟头结点解法 203.移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删…

Python爬虫实战第三例【三】【上】

零.实现目标 爬取视频网站视频 视频网站你们随意&#xff0c;在这里我选择飞某速&#xff08;狗头保命&#xff09;。 例如&#xff0c;作者上半年看过的“铃芽之旅”&#xff0c;突然想看了&#xff0c;但是在正版网站看要VIP&#xff0c;在盗版网站看又太卡了&#xff0c;…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作&#xff0c;同时保持 CMOS 的低功耗。该器件可用作电平转换器&#xff0c;用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

今天BOSS约了个面试,HR直接发我一道面试题

前言 在电商、外卖、预约服务等场景中&#xff0c;订单超时自动取消是一个常见的业务需求。这一功能不仅提高了系统的自动化程度&#xff0c;还为用户提供了更好的体验。需求如下&#xff1a; TODO如果用户在生成订单后一定时间未支付&#xff0c;则系统自动取消订单。接下来…

大路灯哪个品牌好用?5款超火大路灯推荐,帮你全面了解大路灯!

大路灯是一种用于提供良好照明环境的电器&#xff0c;通过专业的技术&#xff0c;将光线用过折射、反射、过滤&#xff0c;最终呈现柔和明亮的光线。但市面上的大路灯琳琅满目&#xff0c;有些大路灯存在虚标数据和配置的问题&#xff0c;夸大宣传过后导致很多人入手&#xff0…

Android中的传感器类型和接口名称

本文将介绍传感器坐标轴、基础传感器和复合传感器&#xff08;动作传感器、姿势传感器、未校准传感器和互动传感器&#xff09;。 1. 传感器坐标轴 许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。 1.1 移动设备坐标轴 Sensor API 仅与屏幕的自然方向相关&a…