冒泡、选择、插入排序算法(c语言)实现

几种常见排序算法的实现

一、冒泡排序

1.百度百科

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

2.C语言实现

分别定义两个函数(从小到大排序)
//冒泡(一轮冒泡之后,数组的最后一个为最大值)
void Bubble(int arr[], int n){
    for(int i = 0; i < n-1; i++){
        int temp;
        if(arr[i] > arr[i+1]){
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }
}
//冒泡排序
void bubbleSorrt(int arr[], int n){
    for(int i = n; i > 0; i--){
        Bubble(arr, i);
    }
for循环嵌套实现
//冒泡排序
void bubbleSorrt(int arr[], int n){
    for(int i = 0; i < n-1; i++)//控制冒泡的轮数
    {
        for(int j = 0; j < n-1-i; j++)//控制每一轮冒泡数组元素交换的次数
        {
            int temp;
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
示例
#include <stdio.h>

//冒泡(一轮冒泡之后,数组的最后一个为最大值)
void Bubble(int arr[], int n){
    for(int i = 0; i < n-1; i++){
        int temp;
        if(arr[i] > arr[i+1]){
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }
}
//冒泡排序
void bubbleSorrt(int arr[], int n){
    // for(int i = n; i > 0; i--){
    //     Bubble(arr, i);
    // }
    for(int i = 0; i < n-1; i++)//控制冒泡的轮数
    {
        for(int j = 0; j < n-1-i; j++)//控制每一轮一轮冒泡的次数,每一轮减一次
        {
            int temp;
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

int main(){
    int arr[7] = {6, 7, 5, 8, 4, 2, 9};
    bubbleSorrt(arr, 7);
    for(int i = 0; i < 7; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

二、选择排序

1.百度百科

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

2.图解

红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。
在这里插入图片描述

3.C语言实现

定义两个函数
//找到最大值的位置(从小到大排序)
int findMaxPos(int arr[], int n){
    int Max_pos = 0;
    int max = arr[Max_pos];
    for(int i = 0; i < n; i++){
        if(arr[i] > max){
            max = arr[i];
            Max_pos = i;
        }
    }
    return Max_pos;
}
//找到最小值的位置(从大到小排序)
int findMinPos(int arr[], int n){
    int Min_pos = 0;
    int min = arr[Min_pos];
    for(int i = 0; i < n; i++){
        if(arr[i] < min){
            min = arr[i];
            Min_pos = i;
        }
    }
    return Min_pos;
}

//选择排序
void selectionSort(int arr[], int n){
    for(int i = n; i > 0; i--){
        int pos = findMinPos(arr, i);//i表示这个数组的大小
        int temp = arr[pos];
        arr[pos] = arr[i-1];
        arr[i-1] = temp;//将最大值与末项交换位置
    }
}

示例

#include <stdio.h>

//找到最小值的位置(从大到小排序)
int findMinPos(int arr[], int n){
    int Min_pos = 0;
    int min = arr[Min_pos];
    for(int i = 0; i < n; i++){
        if(arr[i] < min){
            min = arr[i];
            Min_pos = i;
        }
    }
    return Min_pos;
}

//选择排序
void selectionSort(int arr[], int n){
    for(int i = n; i > 0; i--){
        int pos = findMinPos(arr, i);//改变排列顺序只需改变函数名
        int temp = arr[pos];
        arr[pos] = arr[i-1];
        arr[i-1] = temp;//将最大(小)值与末项交换位置
    }
}

int main(){
    int arr[8] = {6, 7, 10, 11, 4, 11, 9, 7};
    selectionSort(arr, 8);
    for(int i = 0; i < 8; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

三、插入排序

1.维基百科

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2.图解

在这里插入图片描述

3.代码实现

//插入排序
void insertionSort(int arr[], int len){
    for(int i = 1; i < len; i++){
        int pos = i;//pos表示要插入的元素的位置
        int key = arr[pos];//key表示要插入的元素,整个插入过程不会更改
        while(arr[pos-1] > key && pos > 0){
            arr[pos] = arr[pos-1];
            pos--;//位置向前移动一位继续比较
        }
        arr[pos] = key;//将要插入的元素继续保存在pos位置上
    }
}

示例

#include <stdio.h>

//插入排序
void insertionSort(int arr[], int len){
    for(int i = 1; i < len; i++){
        int pos = i;//pos表示要插入的元素的位置
        int key = arr[pos];//key表示要插入的元素
        while(arr[pos-1] > key && pos > 0){
            arr[pos] = arr[pos-1];
            pos--;//位置向前移动一位继续比较
        }
        arr[pos] = key;//将要插入的元素继续保存在pos位置上
    }
}

int main(){
    int arr[12] = {6, 7, 10, 11, 4, 11, 9, 7, 3, 1, 8, 0};
    insertionSort(arr, 12);
    for(int i = 0; i < 12; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

热门文章

暂无图片
编程学习 ·

ubuntu:beyond compare 4 This license key has been revoked 解决办法

错误如图所示:解决办法:(1)先用find命令找到bcompare所在位置:sudo find /home/ -name *bcompare(2)进入 /home/whf/.config,删除/bcomapre文件夹注意一般.config为隐藏文件,通过 ctrl+h 可以显示:(3)cd /usr/lib/beyondcompare/ (4)sudo sed -i "s/keexjEP3…
暂无图片
编程学习 ·

Redis和Memcache缓存核心及原理对比最全解析

1. 缓存基础知识1.1 缓存类型 缓存是高并发场景下提高热点数据访问性能的一个有效手段,在开发项目时会经常使用到。缓存的类型分为:本地缓存、分布式缓存和多级缓存。 本地缓存就是在进程的内存中进行缓存,比如我们的 JVM 堆中,可以用 LRUMap 来实现,也可以使用 Ehcache 这…
暂无图片
编程学习 ·

共识算法 POW/POS

POW/POS在区块链系统中,共识算法是区块链保持数据安全、不可篡改、透明性等特色的关键技术。共识机制是区块链的灵魂,是区块链建立信任的基础。一个区块链项目选择使用何种共识机制,决定了这个项目是否能建立起完善的激励机制,从而起到鼓励更多节点参与到项目中,进而增加系…
暂无图片
编程学习 ·

算法复杂度评价指标(大o表示法)

大O表示法(1)常见的大o数量级函数(2)其他算法复杂度表示法 基本操作数量函数T(n)的精确值并不是特别重要,重要的是Tn(n)中起决定性因素的主导部分。用动态的眼光看,就是当问题规模增大的时候,T(n)中的一些部分会盖过其他部分的贡献。 数量级函数描述了T(n)中随着n增加而…
暂无图片
编程学习 ·

window.performance.navigation.type

performance.navigation.type(该属性返回一个整数值,表示网页的加载来源,可能有以下4种情况):0:网页通过点击链接、地址栏输入、表单提交、脚本操作等方式加载,相当于常数performance.navigation.TYPE_NAVIGATE。1:网页通过“重新加载”按钮或者location.reload()方法加…
暂无图片
编程学习 ·

《剑指 Offer》——调整数组顺序使奇数位于偶数前面

1. 本题知识点 数组 2. 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 例如: Input: [1,2,3,4,5]Output: [1,3,5,2,4]3. 解题思路 …
暂无图片
编程学习 ·

Spring——Bean scope

Spring framework 支持6个范围(scope),其中4个只能在用web-aware时才能使用。当然,你也可以创建自定义范围。singleton : spring默认就是singleton,即在注册该bean的时候,会把这个bean存储到单列bean缓存,以后对该bean的所有的后续请求和引用都会返回缓存中的这一个bean…
暂无图片
编程学习 ·

后台开发核心技术(11):多线程

背景介绍 进程:以前,进程是最小的执行单位。进程是包含程序指令和相关资源的集合,每个进程和其他进程一起参与调度,竞争CPU、内存等资源。每次进程的切换,都存在着进程资源的保存和恢复动作,这称为上下文切换。 发现问题:比如一个简单的GUI程序,为了有更好的交互性,通…
暂无图片
编程学习 ·

分享 github 上JavaArticle 知识库

我喜欢那些闪光的东西,比如冬日的雪花,天上的星星,还有你发光的眼睛。 以前都是被别人授之以鱼,尝到了鱼肉的鲜美,我学习了捕鱼之术,以后希望不仅能授之以鱼,同时也能授之以渔。 面试学会龙叔这套面试秘诀,一套大招带走面试官 当你面试“自我介绍”还在我是XXX时,看到…
暂无图片
编程学习 ·

Layui实现动态加载Tree

目录前言实现步骤初步准备构建data数据源 前言有空研究了一下Layui,感觉相对于EasyUI来说,美观了不少,结合后台加载动态Tree带大家初步了解一下这个框架实现步骤 初步准备 Layui官网 去官网下载好Layui,里面有示例和css、js等文件具体使用步骤: 要使用Layui,必须引入css文件…
暂无图片
编程学习 ·

Web前端页面制作流程以及注意事项,满满的干货!

每天我们打开电脑,看到各种各样的web前端页面。你知道他们是如何制作的吗?为了让页面更具有规范性,让使用者更加方便,在制作页面过程中必须遵循一定的设计流程。在这里就为大家详细介绍一下制作一个Web前端页面的设计流程及注意事项。一:确定网站主题 每个网站都有自身以及…
暂无图片
编程学习 ·

iOS开发之多线程(3)—— GCD

目录版本简介几个概念1. 任务(Task) 和 队列(Queue)2. 同步(sync) 和 异步(async)3. 串行(Serial) 和 并发(Concurrent)4. 主队列(Main Queue) 和 全局队列(Global Queue)GCD的基本使用1. 同步执行 + 串行队列2. 同步执行 + 并发队列3. 异步执行 + 串行队列4. 异步执行 + 并发队…
暂无图片
编程学习 ·

qtdesigner-请假(仅仅是尝试使用软件)

下面是我给他们起的名字。现在修改完名字之后,导出成MainWindow.ui文件打开anaconda的shell现在就产生了MainWindow.py,打开它 打开pycharm,创建一个新的名为askForLeave的project,把MainWindow.py移进来。 创建Leave.py作为主程序(起名废) 现在给MainWindow.py配置环境写…
暂无图片
编程学习 ·

二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 package hk;import java.util.ArrayList;public class Solution {public TreeNode Convert(TreeNode pRootOfTree) {if (pRootOfTree==null){r…
暂无图片
编程学习 ·

CQF笔记M1L3泰勒级数和转移概率密度函数

CQF笔记M1L3泰勒级数和转移密度函数Module 1 Building Blocks of Quant FinanceLecture 2 Taylor Series and Transition Density Functions泰勒级数期权价格的泰勒级数trinomial random walk和转移密度函数Similarity solutions 求解过程 Module 1 Building Blocks of Quant F…
暂无图片
编程学习 ·

程序媛审美测评——控制台256种颜色搭配及控制台改变界面颜色的方法

改变控制台颜色的方法+程序媛审美色调推荐前言改变颜色der方法程序媛颜色审美测评初筛42种搭配复试4种出挑 前言 C语言小学期做大作业,感觉黑底白字略显单调,想换个颜色change一下枯燥的程序(然并卵)。对,前景和背景色各16种,笔者挨个测过去,一共测了256次。在此过程中,…
暂无图片
编程学习 ·

Java NIO(Netty,Redis,Zookeeper高并发实战整理)

Java NIO NIO与OIO的对比 1.OIO事面向流的,NIO是面向缓冲区的。OIO是面向字节流或字符流的,在一般的OIO操作中,一流式的方法顺序地从一个流中读取一个或多个字节,因此,不能随意地改变读取指针的位置。NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。读取和写入,只需…
暂无图片
编程学习 ·

一周信创舆情观察(6.22~6.28)

一、一周舆情要点 第四届世界智能大会本周成功举办,技术服务项目由腾讯云提供支持。大会云签约148个项目,其中内资项目投资809亿元,外资项目投资约16亿美元。会议期间,天津港集团和华为签署战略合作协议,双方将加强信息化顶层设计及智慧港口合作。 数据安全监管趋严,网安…
暂无图片
编程学习 ·

远程工作和数字鸿沟

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!在全球持续蔓延的冠状病毒疫情的影响下,一场革命正在发生:弹性工作革命。很多企业开始意识到这样一个现实,即他们的员工可以远程工作。经过数月的在家工作之后,许多员…
暂无图片
编程学习 ·

排序算法之插入排序、希尔排序、归并排序(C#)

插入排序 两次for循环,外层从数组第二位i=1开始,内层for循环由i向前进行判断,大于则将该位置与遍历位置交换。此时注意,不能按i的位置获取元素,应将该元素暂存,因为交换时对应i位置元素值会变换。c#代码如下/// <summary>/// 插入排序/// </summary>/// <…