【C/C++】排序算法代码实现

这里,汇总了常见的排序算法具体代码实现。使用C语言编写。

排序算法实现

  • 插入排序
  • 冒泡排序
  • 选择排序
  • 快速排序
  • 希尔排序
  • 归并排序

插入排序

#include <stdio.h>
#include <stdlib.h>void InsertSort(int arr[],int n){int i,j,temp;for(i = 1;i < n;i++){   //将各元素插入已排好的序列中if(arr[i] < arr[i-1]){  //若当前元素小于前驱temp = arr[i];    //暂存当前元素for(j = i-1;j >= 0 && arr[j] > temp;j--)  //检查前面所有排好的元素arr[j+1] = arr[j];  //所有大于temp的元素后移arr[j+1] = temp;  //复制到插入位置(j+1:j--多减了一个要加回来)}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);InsertSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

冒泡排序

#include <stdio.h>
#include <stdlib.h>void bubbleSort(int arr[],int n){for(int i=0;i<n-1;i++){//外层循环,n个元素需要循环n-1次for(int j=0;j<n-1-i;j++){  //内层循环,n个元素第i趟比较n-i次if(arr[j]>arr[j+1]){  //将较大的元素后移int temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp;}}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);bubbleSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

选择排序

#include <stdio.h>
#include <stdlib.h>void selectSort(int a[],int n){int i,j,min = 0;for(i=0;i<n-1;i++){min = i;for(j=i+1;j<n;j++){if(a[j]<a[min]){  //寻找最小的数min = j;  //寻找最小的索引保存}}if(i!= min){int tmp = a[i];a[i] = a[min];a[min] = tmp;}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);selectSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

快速排序

#include <stdio.h>
#include <stdlib.h>void quickSort(int a[],int begin,int end){if(begin>=end) return;  //递归结束条件int i = begin,j = end,flag = a[i],tmp = 0;  //第一个为基准while(i!=j){while((i<j)&&(a[j]>flag)) j--; //从最后一个元素出发,每次循环j--,直到找到比flag小的数字,记录下标while((i<j)&&(a[i]<=flag)) i++;  //从开头元素出发,每次循环i++,直到找到比flag大的数字,记录下标if(j>i){  //交换tmp = a[i];a[i] = a[j];a[j] = tmp;}}a[begin] = a[i];a[i] = flag;  //交换基准数与i和j相遇的位置的数quickSort(a,begin,i-1);  //左子数组递归quickSort(a,i+1,end);   //右子数组递归
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);quickSort(a,0,7);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

希尔排序

#include <stdio.h>
#include <stdlib.h>void shellSort(int a[], int n){int i,j,gap;  // gap为步长,每次减为原来的一半for (gap = n / 2; gap > 0; gap /= 2){  // 共gap个数组,对每一组都执行直接插入排序for (i = 0; i < gap; i++) {for (j = i + gap; j < n; j += gap){  // 如果a[j]<a[j-gap],则寻找a[j]位置,并将后面的位置都后移if (a[j] < a[j - gap]){int tmp = a[j];int k = j - gap;while (k >= 0 && a[k] > tmp){a[k + gap] = a[k];k -= gap;}a[k + gap] = tmp;}}}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);shellSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

归并排序

#include <stdio.h>
#include <stdlib.h>void Merge(int arr[], int tmp[], int start,int mid, int end){//合并小组并排序int i = start;  //i标识,左小组的第一个元素位置int j = mid + 1;//j标识,右小组的第一个元素位置int k = start;  //tmp当前小组存放的起始位置while (i < mid + 1 && j < end + 1){//左小组越界或右小组越界才能退出if (arr[i] <= arr[j])tmp[k++] = arr[i++];elsetmp[k++] = arr[j++];}while (j < end + 1){  //如果右边小组没有越界tmp[k++] = arr[j++];}while (i < mid + 1){  //如果左边小组没有越界tmp[k++] = arr[i++];}for (i = start; i <= end; i++){arr[i] = tmp[i];}
}void MergeS(int arr[], int tmp[], int start, int end){//划分小组,现在没有endif (start < end){int mid = (start+end)/2;MergeS(arr, tmp, start, mid);MergeS(arr, tmp, mid + 1, end);Merge(arr, tmp, start, mid, end);}
}void mergeSort(int arr[], int len){int *tmp = (int *)malloc(sizeof(int)*len);//开了一个排序后结果保存的临时数组MergeS(arr, tmp, 0, len - 1);//嵌套调用free(tmp);
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);mergeSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

不同排序算法之间的比较:
在这里插入图片描述

以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/210826.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何使用key登录Linux服务器

场景&#xff1a;因为需要回收root管理员权限&#xff0c;禁止root用户远程登录&#xff0c;办公环境只允许普通用户远程登录&#xff0c;且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户&#xff0c;和设置密码用…

css渐变详解(重复性线性渐变、径向渐变、重复性径向渐变的使用)

目录 线性渐变 重复性线性渐变 径向渐变 重复性径向渐变的使用 线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 其语法格式为&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 参数说明如下&#xff1a; …

OpenCV入门10——特征点检测与匹配

文章目录 特征检测的基本概念Harris角点检测Shi-Tomasi角点检测SIFT关键点检测SIFT计算描述子SURF特征检测OBR特征检测暴力特征匹配FLANN特征匹配实战flann特征匹配图像查找图像拼接基础知识图像拼接实战 特征点检测与匹配是计算机视觉中非常重要的内容。不是所有图像操作都是对…

无人智能货柜:提升购物体验

无人智能货柜&#xff1a;提升购物体验 随着移动支付的普及&#xff0c;人们日常生活中的主要场景已经渗透了这一支付方式。同时&#xff0c;无人智能货柜作为购物的重要渠道&#xff0c;正在崭露头角。通过人工智能、图像识别和物联网技术的应用&#xff0c;无人智能货柜将使购…

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

基于框架的线性回归

线性回归是机器学习中最简单和最常用的回归方法之一。它建立了自变量和因变量之间的线性关系&#xff0c;并通过拟合一条直线或超平面来预测和分析数据。 基于框架的线性回归是构建线性回归模型的一种常见方法&#xff0c;它利用现有的机器学习框架来实现线性回归模型的建立、…

【史上最细教程】服务器MySQL数据库完成主从复制

文章目录 MySQL完成主从复制教程准备&#xff1a;原理&#xff1a;步骤&#xff1a; 推荐文章 MySQL完成主从复制教程 主从复制&#xff08;也称 AB 复制&#xff09;就是将一个服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从…

将所有图片居中对齐

Ctrl h 调出替换框 ^g表示所有图片 格式里面选择段落 全部替换

Halcon学习笔记

目录 一.简介 一.简介 Halcon和OpenCV在工业应用中的区别&#xff1a; OpenCV的精度没Halcon高&#xff1b;OpenCV没有模板匹配&#xff0c;Halcon有&#xff0c;而且Halcon匹配的精度更高。

OpenCV滑块验证码图像缺口位置识别

OpenCV图像缺口位置识别 1、背景2、图像缺口位置识别原理3、图像缺口位置识别实现4、滑块验证码HTTP图像需要保存到本地吗1、背景 在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入…

CS2的到来会对csgo产生什么影响?

从左手持枪到教练观战位&#xff0c;周四更新的CS新版本缺乏CSGO里很多关键功能。社区服务器和创意工坊地图&#xff0c;目前最重要的功能缺失是创意工坊地图和社区服务器。这些社区制作的地图长期以来一直是玩家磨练技能的首选场所&#xff0c;从死斗服务器到用来练习瞄准、跑…

sql调优

慢查询 SQL 治理方案 一、SQL 性能下降的原因 在对 SQL 进行分析之前&#xff0c;需要明确可能导致 SQL 执行性能下降的原因进行分析&#xff0c;执行性能下降可以体现在很多方面&#xff1a; 查询语句写的烂索引没加好表数据过大数据库连接数不够查询的数据量过大被其他慢s…