排序算法(C语言版)

直接插入排序

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 100

//定义顺序表结构体

typedef struct {

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

}RedType;

typedef struct {

RedType rMAXSIZE + 1;//r0闲置或用作哨兵

int length;

}SqList;

//直接插入排序

void InsertSort(SqList& L) {

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

int i, j;

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

if (L.ri.key < L.ri - 1.key) {

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

L.r0 = L.ri;

j = i - 1;

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

while (j > 0 && L.r0.key < L.rj.key) {

L.rj + 1 = L.rj;

j--;

}

//插入到合适位置

L.rj + 1 = L.r0;

}

}

}

void PrintList(SqList L) {

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

printf("%d", L.ri.key);

}

printf("\n");

}

int main() {

SqList L;

L.length = 6;

L.r1.key = 5;

L.r2.key = 3;

L.r3.key = 4;

L.r4.key = 6;

L.r5.key = 2;

L.r6.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 r100 + 1;//r0闲置或用作暂存等用途,所以多开一位

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.ri.key, L.ri - dk.key)) {

//将L.ri暂存在L.r0

L.r0 = L.ri;

for (j = i - dk; j > 0 && LT(L.r0.key, L.rj.key); j -= dk)

L.rj + dk = L.rj;

L.rj + dk = L.r0;

}

}

}

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

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

int k;

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

ShellInsert(L, dltak);

}

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

void PrintList(SqList L) {

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

printf("%d", L.ri.key);

}

printf("\n");

}

int main(void) {

SqList L;

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

L.length = 8;

L.r1.key = 8;

L.r2.key = 1;

L.r3.key = 4;

L.r4.key = 2;

L.r5.key = 7;

L.r6.key = 6;

L.r7.key = 3;

L.r8.key = 5;

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

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

// 选择

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

int t = sizeof(dlta) / sizeof(dlta0);

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 r100 + 1;//r0闲置或用作暂存等用途,所以多开辟一位

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.rj + 1.key, L.rj.key)) {

temp = L.rj + 1;

L.rj + 1 = L.rj;

L.rj = temp;

change = 1;

}

}

}

}

void PrintList(SqList L) {

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

printf("%d", L.ri.key);

}

printf("\n");

}

int main() {

SqList L;

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

L.length = 8;

L.r1.key = 8;

L.r2.key = 1;

L.r3.key = 4;

L.r4.key = 2;

L.r5.key = 7;

L.r6.key = 6;

L.r7.key = 3;

L.r8.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 r100 + 1;//r0闲置或用作暂存等用途,所以多开辟一位

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.r0 = L.rlow;//用子表的第一个记录做枢纽记录

pivotkey = L.rlow.key;//枢纽记录关键字

while (low < high) {

while (low < high && L.rhigh.key >= pivotkey)

--high;

L.rlow = L.rhigh;//将比枢纽记录小的记录放到低端

while (low < high && L.rlow.key <= pivotkey)

++low;

L.rhigh = L.rlow;//将比枢纽记录大的记录放到高端

}

L.rlow = L.r0;//枢纽记录到位

return low;//返回枢纽位置

}

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

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

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

if (low < high) {

//将L.rlow....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.ri.key);

}

printf("\n");

}

int main() {

SqList L;

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

L.length = 8;

L.r1.key = 8;

L.r2.key = 1;

L.r3.key = 4;

L.r4.key = 2;

L.r5.key = 7;

L.r6.key = 6;

L.r7.key = 3;

L.r8.key = 5;

printf("Before sorting: ");

PrintList(L);

QuickSort(L);

printf("After sorting: ");

PrintList(L);

return 0;

}

相关推荐
小欣加油1 天前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly1 天前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕1 天前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei1 天前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld1 天前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi81 天前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang1 天前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
想要成为糕糕手1 天前
前端必修课:JavaScript 数组与数据结构底层逻辑全解析
javascript·数据结构·面试
KaMeidebaby1 天前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠1 天前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc