冒泡排序

冒泡排序是一种简单的排序算法,其基本思想是重复地交换相邻两个元素,将较大的元素向右“冒泡”,较小的元素向左“沉淀”,从而将序列中的最大元素逐渐移到最后面。

#include <stdio.h>

void bub(int arr[],int n){   //首先定义空函数,第一个int参数接受列表,第二个为元素个数
int i,j,temp;
for(i=0;i<n-1;i++){ //这是进行几轮比较。这里是6轮。0,1,2,3,4,5 ,这里有-1可以减少不必要的比较轮次,到最后自己就排好了,因为不是几个数就比较就次,最后一个数会自己还原。
for(j=0;j<n-i-1;j++){ //下标从0开始而不1所以需要n-1。你如果不-1,后面j++,arr[j+1]会超出范围。-i是因为之后不需要再与最大数做比较了
if(arr[j]>arr[j+1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main(){
int arr[] = {64,34,97,12,22,11,90};
int n = sizeof(arr) / sizeof(arr[0]);
bub(arr,n);
printf("sort:\t");
for(int i = 0; i < n; i++) {
printf("%d\t",arr[i]);
}
return 0;
} sort: 11 12 22 34 64 90 97

相较于其他排序算法,冒泡排序的优势在于它的实现简单、容易理解和编写,适用于少量数据的排序。此外,冒泡排序在交换相邻元素的过程中,可以记录是否发生了交换,如果没有发生交换则说明序列已经有序,可以提前结束排序,这样可以减少排序的时间复杂度。但是,对于大量数据排序,冒泡排序的时间复杂度为O(n^2),效率较低,因此不适用于大规模数据的排序。

优化冒泡

#include <stdio.h>
#include <stdbool.h> #有bool的时候最好加上 void bubble_sort(int arr[], int n) {
bool is_sorted = false;
int i, j, temp; for (i = 0; i < n - 1; i++) {
is_sorted = true;
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) { //如果在这个for循环里,此if一次都未执行。那么is_sorted就不会变为false,也证明已经不需要换位置了。直接跳出当前循环,执行if语句,然后跳出大循环
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
is_sorted = false;
}
}
if (is_sorted) {
break;
}
}
} int main() {
int arr[] = { 4, 2, 6, 1, 9, 5 };
int n = sizeof(arr) / sizeof(arr[0]);
int i; bubble_sort(arr, n); for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
} return 0;
}

选择排序

选择排序是一种简单直观的排序算法,它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

#include <stdio.h>

void selectsort(int arr[],int n){
int min,i,j,temp;
for(i=0; i < n- 1; i++){
min=i; //取得最小的下标
for (j= i+1 ;j < n;j++) //每次都要比较到最后一个元素所以j<n
if(arr[j]<arr[min]){ //如果最小的下标的值不是最小值,将最小值的小标赋予min
min=j;
}
temp=arr[i]; //将这个最小下标的值存起来
arr[i]=arr[min]; //最小值赋予最小下标
arr[min]=temp; //将最小下标的值赋予min。也就是之前j的位置
}
} int main(){ int a[] = {1,5,23,45,23,92,12};
int n = sizeof(a)/sizeof(a[0]);
selectsort(a,n);
for (int i = 0;i<n;i++) {
printf("%d\t", a[i]);
}
return 0;
}

快速排序

待排序的序列中,随机选一个数字作为pivot中心轴

所有小于中心轴放左,大于则放右边

左边比pivot中心轴小,而右边全比pivot大

然后对左子序列和右子序列重复以上的操作

/*
快速排序算法
思想: 递归思想
什么是递归?
自我调用(循环)的函数
有参数向着递归边界靠,直到达到递归边界
*/
/*
#include <stdio.h>
int f(int n){
if(n==0||n==1){
return 1;
} else{
return n*f(n-1);
}
}
int main(){
int n=5;
printf("%d ",f(n)); return 0;
}
*/
#include <stdio.h>
int FaindPos(int* a, int left, int right) {
int val = a[left];
while (left < right) {
while (left < right && a[right] >= val) {
right--;
}
a[left] = a[right];
while (left < right && a[left] <= val) {
left++;
}
a[right] = a[left];
}
a[left] = val;
return left;
} void QuickSort(int* a, int left, int right) {
if (left >= right) {
return;
} else {
int val = a[left];
int pos = FaindPos(a, left, right);
a[pos] = val;
QuickSort(a, left, pos - 1);
QuickSort(a, pos + 1, right);
}
} int main() {
int a[] = {6, 5, 7, 8, 3, 4, 2, 1};
QuickSort(a, 0, 7);
for (int i = 0; i < 8; i++) {
printf("%d ", a[i]);
}
return 0;
}

C语言排序 冒泡 选择 快排的更多相关文章

  1. 排序算法C语言实现——冒泡、快排、堆排对比

    对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...

  2. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  3. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  4. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  5. 【PHP数据结构】交换排序:冒泡、快排

    上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排, ...

  6. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  7. Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

  8. Java排序算法 [选择、冒泡、快排]

    选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...

  9. Java实现的各种排序算法(包括冒泡,快排等)

    //堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...

  10. python 冒泡和快排,不多说【无聊】

    #-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...

随机推荐

  1. error while loading shared libraries: libSM.so.6: cannot open shared object file: No such file or di

    前言 运行 ida软件报错, 但是我的系统中存在 libSM.so.6 解决办法 首先查看系统中的 libsm.so.6 ldconfig -p |grep -i libsm.so.6 输出: lib ...

  2. vue项目中配置scss

    之前创建 vue 项目的时候没有选择 scss 预编译,现在项目中要使用,不知道如何配置,网上搜了下全都是: npm  install sass-loader --save-devnpm instal ...

  3. 微服务开发平台 Spring Cloud Blade 部署实践

    本文介绍使用 Rainbond 快速部署 Spring Cloud Blade 微服务平台.Spring Cloud Blade 是一个由商业级项目升级优化而来的微服务架构,采用Spring Boot ...

  4. Python Excel 处理模块 : OpenPyXL

    OpenPyXL模块使用方法 以下是介绍OpenPyXL的基本使用,不涉及样式和合并单元格的跨行操作 一般来说,对于大名鼎鼎的xlrd,xlwt和xlutils三个模块,Excel操作有3个基本状态 ...

  5. 学习ASP.NET Core Blazor编程系列十六——排序

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  6. BOM与DOM之BOM操作

    目录 一:BOM与DOM操作 1.BOM与DOM操作 二:BOM操作 1.常用的Window方法: 2.案例实操 3.打开新窗口 4.关闭当前页面 三:window的子对象 1.navigator对象 ...

  7. JavaScript:七大基础数据类型:大整数bigint

    因为数值number有表示范围,所以当我们需要精确表示更大的数字时,我们需要用到大整数bigint: 事实上,大整数可以精确表示任意长度的整数: 我们可以通过在整数的末尾添加字母n,来声明它是一个大整 ...

  8. ssm——spring整理

    目录 1.概述 2.Spring工厂与IOC 2.1.为什么要有Spring框架 2.2.什么是IOC 2.Spring工厂对实例注入 2.1.使用标签进行注入 2.2.使用注解进行注入 2.2.3. ...

  9. Linux安装&卸载mysql5.7

    Linux系统下卸载mysql 停止mysql服务 systemctl stop mysqld.service 查看安装的mysql服务 rpm -qa|grep -i mysql 删除安装的mysq ...

  10. [OpenCV实战]40 计算机视觉工具对比

    文章目录 1 简介 2 适用于计算机视觉的MATLAB 2.1 为什么要使用MATLAB进行计算机视觉:优点 2.2 为什么不应该将MATLAB用于计算机视觉:缺点 3 适用于计算机视觉的OpenCV ...