排序算法(C语言版)

news/2025/1/17 19:27:52/

直接插入排序

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 100

//定义顺序表结构体

typedef struct {

       int key;//这里可以根据实际需求添加其他数据成员

}RedType;

typedef struct {

       RedType r[MAXSIZE + 1];//r[0]闲置或用作哨兵

       int length;

}SqList;

//直接插入排序

void InsertSort(SqList& L) {

       //对顺序表L作直接插入排序

       int i, j;

       for (i = 2; i <= L.length; ++i) {

              if (L.r[i].key < L.r[i - 1].key) {

                     //将待插入元素暂存到L.r[0]中,这里把r[0]当作哨兵

                     L.r[0] = L.r[i];

                     j = i - 1;

                     //从后往前查找合适的插入位置,边比较边后移元素

                     while (j > 0 && L.r[0].key < L.r[j].key) {

                            L.r[j + 1] = L.r[j];

                            j--;

                     }

                     //插入到合适位置

                     L.r[j + 1] = L.r[0];

              }

       }

}

void PrintList(SqList L) {

       for (int i = 1; i <= L.length; i++) {

              printf("%d", L.r[i].key);

       }

       printf("\n");

}

int main() {

       SqList L;

       L.length = 6;

       L.r[1].key = 5;

       L.r[2].key = 3;

       L.r[3].key = 4;

       L.r[4].key = 6;

       L.r[5].key = 2;

       L.r[6].key = 1;

       printf("Before sorting:");

       PrintList(L);

       InsertSort(L);

       printf("After sorting:");

       PrintList(L);

       return 0;

}

希尔排序

#include<stdio.h>

#include<stdlib.h>

//定义顺序表中元素的结构体

typedef struct {

       int key;

       //这里可以根据实际需求添加其他数据成员

}RedType;

//定义顺序结构体

typedef struct {

       RedType r[100 + 1];//r[0]闲置或用作暂存等用途,所以多开一位

       int length;

}SqList;

//比较LT,用于比较两个元素的大小,返回1表示前者小于后者,0表示大于等于

int LT(int a, int b) {

       return a < b;

}

//一趟希尔插入排序函数

void ShellInsert(SqList& L, int dk) {

       int i, j;

       for (i = dk + 1; i <= L.length; ++i) {

              if (LT(L.r[i].key, L.r[i - dk].key)) {

                     //将L.r[i]暂存在L.r[0]

                     L.r[0] = L.r[i];

                     for (j = i - dk; j > 0 && LT(L.r[0].key, L.r[j].key); j -= dk)

                            L.r[j + dk] = L.r[j];

                     L.r[j + dk] = L.r[0];

              }

       }

}

//希尔排序函数,按给定增量序列对顺序表进行希尔排序

void ShellSort(SqList& L, int dlta[], int t) {

       int k;

       for (k = 0; k < t; ++k)

              ShellInsert(L, dlta[k]);

}

//打印顺序表函数,方便查看排序前后顺序表中元素的情况

void PrintList(SqList L) {

       for (int i = 1; i <= L.length; i++) {

              printf("%d", L.r[i].key);

       }

       printf("\n");

}

int main(void) {

       SqList L;

       //初始化顺序表长度及元素

       L.length = 8;

       L.r[1].key = 8;

       L.r[2].key = 1;

       L.r[3].key = 4;

       L.r[4].key = 2;

       L.r[5].key = 7;

       L.r[6].key = 6;

       L.r[7].key = 3;

       L.r[8].key = 5;

       //定义增量序列,这里选择一个简

       // 单示例,实际应用中可根据情况优化

       // 选择

       int dlta[] = { 4,2,1 };

       int t = sizeof(dlta) / sizeof(dlta[0]);

       printf("Before sorting:");

       PrintList(L);

       ShellSort(L, dlta, t);

       printf("After sorting :");

       PrintList(L);

       return 0;

}

冒泡排序

#include<stdio.h>

#include<stdlib.h>

//定义顺序表中的元素的结构体

typedef struct {

       int key;

       //这里可以根据实际需求添加其他数据成员

}RedType;

//定义顺序表结构体

typedef struct {

       RedType r[100 + 1];//r[0]闲置或用作暂存等用途,所以多开辟一位

       int length;

}SqList;

//比较函数LT,用于比较两个元素的大小,返回1表示前者小于后者,0表示大于等于

int LT(int a, int b) {

       return a < b;

}

// 冒泡排序函数

void BubbleSort(SqList& L) {

       int i, j, change = 1;

       for (i = 1; i < L.length && change; ++i) {

              change = 0;

              for (j = 1; j <= L.length - i; ++j) {

                     RedType temp;

                     if (LT(L.r[j + 1].key, L.r[j].key)) {

                            temp = L.r[j + 1];

                            L.r[j + 1] = L.r[j];

                            L.r[j] = temp;

                            change = 1;

                     }

              }

       }

}

void PrintList(SqList L) {

       for (int i = 1; i <= L.length; i++) {

              printf("%d", L.r[i].key);

       }

       printf("\n");

}

int main() {

       SqList L;

       // 初始化顺序表长度及元素

       L.length = 8;

       L.r[1].key = 8;

       L.r[2].key = 1;

       L.r[3].key = 4;

       L.r[4].key = 2;

       L.r[5].key = 7;

       L.r[6].key = 6;

       L.r[7].key = 3;

       L.r[8].key = 5;

       printf("Before sorting: ");

       PrintList(L);

       BubbleSort(L);

       printf("After sorting: ");

       PrintList(L);

       return 0;

}

快速排序

#include<stdio.h>

#include<stdlib.h>

//定义顺序表中元素的结构体

typedef int KeyType;

typedef struct {

       int key;

}RedType;

//定义顺序表结构体

typedef struct {

       RedType r[100 + 1];//r[0]闲置或用作暂存等用途,所以多开辟一位

       int length;

}SqList;

//比较函数LT,用于比较两个元素的大小,返回1表示前者小于后者,0表示大于等于

int LT(int a, int b) {

       return a < b;

}

//划分函数,采用第二个版本相对简洁的实现方式,将序列划分为2部分

int Partition(SqList& L, int low, int high) {

       KeyType pivotkey;

       L.r[0] = L.r[low];//用子表的第一个记录做枢纽记录

       pivotkey = L.r[low].key;//枢纽记录关键字

       while (low < high) {

              while (low < high && L.r[high].key >= pivotkey)

                     --high;

              L.r[low] = L.r[high];//将比枢纽记录小的记录放到低端

              while (low < high && L.r[low].key <= pivotkey)

                     ++low;

              L.r[high] = L.r[low];//将比枢纽记录大的记录放到高端

       }

       L.r[low] = L.r[0];//枢纽记录到位

       return low;//返回枢纽位置

}

//递归进行快速排序的函数

void QSort(SqList& L, int low, int high) {

       int pivotloc;//用于存储返回的枢纽位置

       if (low < high) {

              //将L.r[low....high]一分为二

              pivotloc = Partition(L, low, high);

              //低子表递归排序,pivotloc是一分为二的枢纽位置

              QSort(L, low, pivotloc - 1);

              //对高子表递归排序

              QSort(L, pivotloc + 1, high);

       }

}

//对外接口的快速排序函数,启动对整个顺序表的快速排序

void QuickSort(SqList& L) {

       QSort(L, 1, L.length);

}

//打印顺序表函数,方便查看排序前后顺序表中元素的情况

void PrintList(SqList L) {

       for (int i = 1; i <= L.length; i++) {

              printf("%d", L.r[i].key);

       }

       printf("\n");

}

int main() {

       SqList L;

       // 初始化顺序表长度及元素

       L.length = 8;

       L.r[1].key = 8;

       L.r[2].key = 1;

       L.r[3].key = 4;

       L.r[4].key = 2;

       L.r[5].key = 7;

       L.r[6].key = 6;

       L.r[7].key = 3;

       L.r[8].key = 5;

       printf("Before sorting: ");

       PrintList(L);

       QuickSort(L);

       printf("After sorting: ");

       PrintList(L);

       return 0;

}


http://www.ppmy.cn/news/1563951.html

相关文章

Swift语言的数据库编程

Swift语言的数据库编程 引言 在现代应用程序的开发中&#xff0c;数据的存储和管理是一个至关重要的环节。无论是移动应用、Web服务还是桌面软件&#xff0c;数据库都扮演着数据存储和检索的核心角色。随着Swift语言在iOS和macOS开发中的普及&#xff0c;越来越多的开发者开始…

mobaxterm内置编辑器中文出现乱码如何解决:直接更换编辑器为本地编辑器

诸神缄默不语-个人CSDN博文目录 使用场景是我需要用mobaxterm通过SSH的方式登录服务器&#xff0c;进入服务器之后我就直接打开代码文件&#xff0c;mobaxterm会直接用内置的编辑器&#xff08;MobaTextEditor&#xff09;打开&#xff0c;但这会导致中文编程乱码。 我一开始是…

【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法

目录 一、程序介绍 二、mysqld--mysql服务器介绍 三、mysql - MySQL 命令行客户端 3.1 客户端介绍 3.2 mysql 客户端选项 指定选项的方式 mysql 客户端命令常用选项 在命令行中使用选项 选项(配置)文件 使用方法 选项文件位置及加载顺序 选项文件语法 使用举例&am…

Conda的一些常用命令

以下是Conda的一些常用命令&#xff1a; pip freeze > requirements.txt pip install -r requirements.txt 基本信息查看类 查看conda版本&#xff1a; conda -V 或 conda --version 可以查看当前安装的conda版本。 查看conda帮助信息&#xff1a; conda -h 或 conda --he…

第九章:演示文稿软件PPT

文章目录&#xff1a; 一&#xff1a;界面 1.介绍 2.选项卡 2.1 开始 2.2 插入 2.3 设计 2.4 切换 2.5 动画 2.6 放映 2.7 审阅 2.8 视图 2.9 音频工具 2.10 视频工具 二&#xff1a;基础 三&#xff1a;设计 1.静态 2.动态 四&#xff1a;放映 一&#xff1…

Linux——信号的创建、保存和处理

Linux——进程信号-CSDN博客 文章目录 目录 文章目录 前言 一、创建进程的信号 1、键盘输入方式 2、系统接口 3、指令获得信号 4、硬件异常产生信号 5、软件条件产生信号 二、信号的保存 1、pending表 2、阻塞信号&#xff08;block位图表&#xff09; 信号集&#xff1a;&…

使用vnstat监控网络流量和带宽占用

使用vnstat监控网络流量和带宽占用 简介 vnstat是个Linux下基于shell终端的网络流量监控工具&#xff0c;可帮助用户在不同时间段内监视&#xff0c;记录和查看网络统计信息。它提供了各种网络接口的汇总&#xff0c;允许用户以详细表或命令行统计视图的形式查看小时&#xf…

Kotlin实现DataBinding结合ViewModel的时候,提示找不到Unresolved reference: BR解决方案

在用Kotlin语言实现DataBinding结合ViewModel的代码的时候&#xff0c;如下所示&#xff1a; class UserModel(private val userName: String, private val userAge: Int) : BaseObservable() {get:Bindablevar name: String userNameset (value) {field valuenotifyPropert…