C语言四大排序算法实战

今天主要我练习了 C语言中的几种常见排序算法。包括以下内容、:

  1. 使用 qsort() 的标准库快速排序

  2. 手写冒泡排序

  3. 手写快速排序

  4. 插入排序

(一)四种算法区别

(二)使用 qsort() 函数的快速排序

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// qsort 的比较函数
int compare(const void* left, const void* right)
{
	return *(int*)left - *(int*)right;
}

int main()
{
	int arr1[10] = { 1,3,2,4,6,5,8,7,9,11 };

	// 使用 C 标准库的 qsort 进行排序
	qsort(arr1, 10, sizeof(int), compare);

	// 输出排序结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

(三)冒泡排序

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int elemtype;
typedef struct sttable {
	elemtype* data;
	int len;
}sttable;

// 初始化结构体并随机生成数据
void init_ST(sttable& ST, int length)
{
	ST.len = length;
	ST.data = (elemtype*)malloc(sizeof(elemtype) * ST.len);
	srand(time(NULL));
	for (int i = 0; i < ST.len; i++)
	{
		ST.data[i] = rand() % 100;
	}
}

// 冒泡排序(双层循环,两两比较)
void bubble_ST(sttable& ST, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (ST.data[j] > ST.data[j + 1])
			{
				// 使用异或实现交换
				ST.data[j] = ST.data[j] ^ ST.data[j + 1];
				ST.data[j + 1] = ST.data[j] ^ ST.data[j + 1];
				ST.data[j] = ST.data[j] ^ ST.data[j + 1];
			}
		}
	}
}

// 打印数组
void print_ST(sttable ST)
{
	for (int i = 0; i < ST.len; i++)
	{
		printf("%3d", ST.data[i]);
	}
	printf("\n");
}

int main()
{
	sttable ST;
	init_ST(ST, 10);
	print_ST(ST);
	bubble_ST(ST, 10);
	print_ST(ST);
	return 0;
}

(四)快速排序

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int elemtype;
typedef struct Sstable {
	elemtype* data;
	int length;
}sstable;

// 初始化随机数组
void init_table(sstable& ST, int len)
{
	ST.length = len;
	ST.data = (elemtype*)malloc(sizeof(elemtype) * ST.length);
	srand(time(NULL));
	for (int i = 0; i < ST.length; i++)
	{
		ST.data[i] = rand() % 100;
	}
}

// 打印数组
void print_ST(sstable ST)
{
	for (int i = 0; i < ST.length; i++)
	{
		printf("%3d", ST.data[i]);
	}
	printf("\n");
}

// 划分函数:返回枢轴位置
int partition(int* p, int low, int high)
{
	int pivot = p[low];
	while (low < high)
	{
		while (low < high && p[high] >= pivot)
			high--;
		p[low] = p[high];
		while (low < high && p[low] <= pivot)
			low++;
		p[high] = p[low];
	}
	p[low] = pivot;
	return low;
}

// 快速排序递归实现
void quick_sort(int* p, int low, int high)
{
	if (low < high)
	{
		int pivot_pos = partition(p, low, high);
		quick_sort(p, low, pivot_pos - 1);
		quick_sort(p, pivot_pos + 1, high);
	}
}

int main()
{
	sstable ST;
	init_table(ST, 10);
	print_ST(ST);
	quick_sort(ST.data, 0, 9);
	print_ST(ST);
	return 0;
}

(五)插入排序(直接插入法)

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int elemtype;
typedef struct Sstable {
	elemtype* data;
	int length;
}sstable;

// 初始化随机数组
void init_table(sstable& ST, int len)
{
	ST.length = len;
	ST.data = (elemtype*)malloc(sizeof(elemtype) * ST.length);
	srand(time(NULL));
	for (int i = 0; i < ST.length; i++)
	{
		ST.data[i] = rand() % 100;
	}
}

// 打印数组
void print_ST(sstable ST)
{
	for (int i = 0; i < ST.length; i++)
	{
		printf("%3d", ST.data[i]);
	}
	printf("\n");
}

// 直接插入排序
void insert_sort(int* p, int n)
{
	int i, j, interval;
	for (i = 1; i < n; i++)
	{
		interval = p[i]; // 保存待插入元素
		for (j = i - 1; j >= 0 && p[j] > interval; j--)
		{
			p[j + 1] = p[j]; // 向后移动
		}
		p[j + 1] = interval; // 插入到正确位置
	}
}

int main()
{
	sstable ST;
	init_table(ST, 10);
	print_ST(ST);
	insert_sort(ST.data, 10);
	print_ST(ST);
	return 0;
}
相关推荐
小O的算法实验室2 分钟前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09116 分钟前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
传奇开心果编程8 分钟前
【ArkUI进阶练中学】第19课:AI安全与隐私治理
学习·ui·华为·harmonyos
坤坤子吖12 分钟前
Python基础语法学习:函数
开发语言·笔记·python·学习
言乐617 分钟前
Python体现逻辑回归和决策树的区别
开发语言·python·算法·决策树·逻辑回归
HugoStudio_SWAN30 分钟前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
红豆诗人37 分钟前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法
HZjiangzi37 分钟前
深耕精密驱动二十六载,捷昌驱动助力机器人产业升级发展
人工智能·算法
奋发向前wcx37 分钟前
CSP-J复赛模拟赛3 王晨旭补题 2026.10.4
算法
其实防守也摸鱼39 分钟前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化