首页 > 编程语言 >[数据结构] 排序算法的原理代码及可视化演示

[数据结构] 排序算法的原理代码及可视化演示

时间:2023-02-13 12:01:14浏览次数:59  
标签:排序 演示 nums int right 可视化 static 数据结构 left

排序算法

本文汇总了核心排序算法及其代码实现:
  - 插入法:直接插入排序,折半插入排序,2-路插入排序(折半插入的改进版)(待更新),希尔排序(待更新)
  - 交换法:冒泡排序,快速排序
  - 选择法:简单选择排序,树形选择排序(待更新),堆排序(待更新)
  - 2-路归并排序
  - 计数排序
  - 桶排序(待更新)
  - 基数排序

1. “插入”

1.1. 直接插入排序

public static void insertSort(int[] nums){
    for(int i = 1;i<nums.length;i++){
        int j = i;
        while(j > 0 && nums[j]<nums[j-1] ){
            int temp = nums[j-1];
            nums[j-1] = nums[j];
            nums[j] = temp;
            j--;
        }
    }
}

1.2. 折半插入排序

public static void binaryInsertSort(int[] nums){
    for(int i=1;i<nums.length;i++){
        int j = i;
        int num = nums[j];
        int left = 0,right = i-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(num >= nums[mid]){
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        for(j=i;j>right+1;j--){
            nums[j]=nums[j-1];
        }
        nums[right+1] = num;
    }
}

2. “交换”

2.1. 冒泡排序

public static void bubbleSort(int[] nums) {
    for(int i = 0;i<nums.length;i++){
        int j=nums.length-1;
        while(j>i){
            if(nums[j]<nums[j-1]){
                int temp = nums[j-1];
                nums[j-1] = nums[j];
                nums[j] = temp;
            }
            j--;
        }
    }
}

2.2. 快速排序

public static void quickSort(int[] nums, int left, int right) {
    if (left < right) {
        int pivot = sort(nums, left, right);
        quickSort(nums, left, pivot - 1);
        quickSort(nums, pivot + 1, right);
    }
}

private static int sort(int[] nums, int left, int right) {
    int point = nums[left];
    int i = left, j = right;
    while (i < j) {
        while (i < j && nums[j] > point) {
            --j;
        }
        if (i < j) {
            nums[i++] = nums[j];
        }
        while (i < j && nums[i] < point) {
            i++;
        }
        if (i < j) {
            nums[j--] = nums[i];
        }
    }
    nums[i] = point;
    return i;
}

3. “选择”

3.1. 简单选择排序

public static void selectSort(int[] nums){
    for(int i=0;i<nums.length;i++){
        int min = nums[i];
        int index = i;
        for(int j=i;j<nums.length;j++){
            if(nums[j]<min){
                min = nums[j];
                index = j;
            }
        }
        int temp = nums[index];
        nums[index] = nums[i];
        nums[i] = temp;
    }
}

3.2. 树形选择排序(待更新)

3.3. 堆排序(待更新)

4. “归并”

4.1. 2-路归并排序

public static void mergeSort(int[] nums,int left,int right){
    int mid = (left+right)/2;
    if(left<right){
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
    }
    merge(nums,left,mid,right);
}
private static void merge(int[] nums,int left,int mid,int right){
    if(left<right){
        int[] tempArr = new int[nums.length];
        for(int i=left;i<=right;i++){
            tempArr[i]=nums[i];
        }
        int p=left,q=mid+1,t=left;
        while(p<=mid && q<=right) {
            if (tempArr[p] <= tempArr[q]) {
                nums[t++] = tempArr[p++];
            }else{
                nums[t++] = tempArr[q++];
            }
        }
        while(p<=mid){
            nums[t++]=tempArr[p++];
        }
        while(q<=right){
            nums[t++]=tempArr[q++];
        }
    }
}

5. 计数排序、桶排序、基数排序

5.1. 计数排序

(代码待补充)

5.2. 桶排序(待更新)

5.3. 基数排序

(代码待补充)


===后续仍在持续更新===



Reference

各排序过程的可视化展示,可访问此网站:Data Structure Visualizations

标签:排序,演示,nums,int,right,可视化,static,数据结构,left
From: https://www.cnblogs.com/sonor/p/17115832.html

相关文章

  • 期末复习 | CUMT数据结构实验期末——精简版题解
    前言该博客保存了博主本人的刷题记录,博客中题源来自学长博客和CUMTOJ,但是由于本人记性不好,忘记了CUMTOJ的密码TT,如有错误敬请指正!该博客的解题代码很大程度上参照了Acwi......
  • 期末复习 | CUMT数据结构理论
    数据结构复习基础知识O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)线性表掌握顺序表的存储结构以及基本操作操作的代码实现以及它的优缺点——代码......
  • 第二章 数据结构二
    Trie树(字典树)Trie树,又称字典树,是用来高效存储和查找字符串集合的一种数据结构查找时,可以高效的查找某个字符串是否在Trie树中出现过,并且可以查找出现了多少次其逻辑结......
  • 第二章 数据结构三
    哈希表哈希表的作用:把一个比较大的空间,映射到一个比较小的空间。一般做哈希运算时,取一个质数作为模,会使得冲突的概率降低哈希表的存储冲突解决方法开放寻址法拉链法......
  • 第二章 数据结构一
    链表用数组模拟链表(链式向前星)分类:单链表,最主要用单链表写邻接表,用邻接表存储图或者树双链表,优化某些问题对于单链表,开2个数组val[N],nxt[N],其中val用来存每个链......
  • 卷积神经网络的可视化
    对于大多数深度学习模型,模型学到的表示都难以用人类可以理解的方式提取和呈现。但对于卷积神经网络来说,我们可以很容易第提取模型学习到的表示形式,并以此加深对卷积神经网......
  • (数据库系统概论|王珊)第二章关系数据库-第一节:关系数据结构及其形式化定义
    ​​pdf下载:密码7281​​​​点击这里阅读效果更好:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解​​@[toc]前面说过,数据模型由以......
  • 数据结构
    树状数组https://oi-wiki.org/ds/fenwick/   管辖区间右边界:c数组下标i;左边界:i-lowbit(i)+1;   lowbit(i)表示c[i]区间长度 所以c[i]管辖的区间为[i......
  • (数据库系统概论|王珊)第二章关系数据库-第一节:关系数据结构及其形式化定义
    pdf下载:密码7281点击这里阅读效果更好:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解@目录一:关系(1)域(2)笛卡尔积(3)关系A:基本概述B......
  • 【数据结构与算法】图论算法(C++实现)
    一些基本概念图一个图\(G=(V,E)\)由顶点集V和边集E组成。每一条边就是一副顶点对\((u,v)\),其中\(u,v\inV\)。顶点u和顶点v邻接当且仅当\((u,v)\inE\)......