C语言排序 冒泡 选择 快排
冒泡排序
冒泡排序是一种简单的排序算法,其基本思想是重复地交换相邻两个元素,将较大的元素向右“冒泡”,较小的元素向左“沉淀”,从而将序列中的最大元素逐渐移到最后面。
#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语言排序 冒泡 选择 快排的更多相关文章
- 排序算法C语言实现——冒泡、快排、堆排对比
对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...
- iOS常见算法(二分法 冒泡 选择 快排)
二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = l ...
- 冒泡,快排算法之javascript初体验
引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- 【PHP数据结构】交换排序:冒泡、快排
上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排, ...
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...
- Java排序算法 [选择、冒泡、快排]
选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...
- Java实现的各种排序算法(包括冒泡,快排等)
//堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...
- python 冒泡和快排,不多说【无聊】
#-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...
随机推荐
- MySQL进阶实战4,MySQL索引详解,下篇
一.索引 索引是存储引擎用于快速查找记录的一种数据结构.我觉得数据库中最重要的知识点,就是索引. 存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣.例如MyISAM使用前缀压缩技术使 ...
- 数电第8周周结_by_yc
基本知识: 1.有限状态机的分类: Moore型:输出仅与电路的状态有关: Mealy型:输出与当前电路状态和当前电路输入有关. 2.有限状态机的描述方法: 状态转换图:节点:状态(Moore输出): ...
- mysql-DuplicateUpdate和java的threadpool的"死锁"
大家千万不要被文章的标题给迷惑了,他两在本篇文章是没有关系的, 今天给大家讲讲最近2个有意思的issue,分享一下我学到的 mysql DuplicateUpdate的用法要注意的点 java的thr ...
- 【Scala】上:学习文档、文章、思维导图
〇.可查阅资料 1.文档 英文文档:https://tool.oschina.net/apidocs/apidoc?api=scala-docs-2.9.2 与java:https://docs.sc ...
- 在Maven中出现javax.mail中文乱码问题解决记录
学习Java时,看廖雪峰大神文章使用了javax.mail来发送SMTP邮件.在加入中文时,发现收到的邮件里中文都是乱码. 按照一般经验,多半是编码的问题.然而在代码中,会涉及到编码的地方已经全部设置 ...
- 聚焦技术,锐意创新,GaussDB给世界一个更优选择
摘要:从整个行业应用层面来看,现在,数据库的国产化时代已经到来. 本文分享自华为云社区<聚焦技术,锐意创新,GaussDB给世界一个更优选择>,作者: GaussDB数据库. 今天,以&q ...
- 使用JsonConverter处理上传文件的路径
场景 我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要web服务器中的一个虚拟路径.这个虚拟路径的存储会有一个问题,我们应该在数据库里存什么?是带域名 ...
- [图像处理] YUV图像处理入门4
9 yuv420图像截取 本程序中的函数主要是对YUV420P视频数据流的第一帧图像进行截取.类似opencv中的rect函数,函数的代码如下所示: /** * @file 9 yuv_clip.cp ...
- [OpenCV实战]41 嵌入式计算机视觉设备选择
文章目录 1 简介 1.1 深度学习与传统计算机视觉 1.2 性能考量 1.3 社区支持 2 结论 3 参考 在计算机视觉领域中,不同的场景不同的应用程序需要不同的解决方案.在本文中,我们将快速回顾可 ...
- 2023牛客寒假算法基础集训营2 ABCDEFHJKL
比赛链接 A 题解 知识点:数学. 用 \(n\) 减去区间1的端点得到匹配的一个区间,求一下与区间2的交集. 一个小公式,两区间 \([L_1,R_1]\) 和 \([L_2,R_2]\) 的交集长 ...