今天主要我练习了 C语言中的几种常见排序算法。包括以下内容、:
-
使用
qsort()
的标准库快速排序 -
手写冒泡排序
-
手写快速排序
-
插入排序
(一)四种算法区别

(二)使用 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;
}