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 ...
随机推荐
- 多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践
伴随着国家产业升级的推进和云原生技术成熟,多点 DMALL 大数据技术也经历了从存算一体到存算分离的架构调整变迁.本文将从引入 Kyuubi 实现统一 SQL Proxy 的角度讲述这一探索实践的历程 ...
- SSH(一)架包的引入
一年多未使用了,有些东西真的会忘. 一.ssh的图形化记忆运作流程 二.Struts2.hibernate.spring需要引用的jar包 Struts2: 基本开发:struts-2.3.32\ap ...
- js day04 综合案例秒数计算
<script> //用户输入总秒数 let second = +prompt('请输入总秒数:') //计算时分秒 fun ...
- Mybatis04:延迟加载、一二级缓存、注解开发
今日内容 mybatis中的延迟加载 延迟加载的概念 立即加载的概念 如果实现延迟加载 Mybatis中的缓存 什么是缓存 为什么使用缓存 什么数据可以使用缓存,什么样的数据不能使用缓存 Mybati ...
- 爬了10000张NASA关于火星探索的图片,我发现了一个秘密
前言 最近,我使用爬虫技术,爬取了美国航空航天局,也就是你电影里经常见到的 NASA, 火星探索的相关图片,有 10000 张吧. 嗯嗯,小事情,小事情. 完事儿之后,有点小激动,于是就有了这篇文章, ...
- LeetCode HOT 100:组合总和
题目:39. 组合总和 题目描述: 给你一个没有重复元素的数组,和一个target目标值,返回数组中可以使数字和为目标数target的所有不同组合.什么叫组合?组合就是数组中任意数字组成的集合,不需要 ...
- ArcObjects SDK开发 016 在ArcMap中使用Toolbox
1.如何找到ToolBox 通过Geoprocessing菜单上的ArcToolbox菜单项,可以打开ArcToolbox面板. 工具栏上也有一个ArcToolbox的按钮,点击该按钮也可以打开. 通 ...
- html排版,样式
<style> .box{ width: 600px; height: 800px; backgro ...
- 笑死,面试官又问我SpringBoot自动配置原理
面试官:好久没见,甚是想念.今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的"特性"了.众所周知,Spr ...
- DVWA靶场实战(二)——Command Injection
DVWA靶场实战(二) 二.Command Injection: 1.漏洞介绍: Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令 ...