C++ 排序

插入排序(Insert Sort):将待排序的元素按照关键字的大小插入到前面已有序列中

const int N = 1e6 + 10;

int n;

int aN;

void insert_sort()

{

//依此枚举待排序的元素

for(int i = 2; i <= n; i++) //第一个位置默认是有序的

{

int key = ai;

//前面比key大的,统一右移

int j = i - 1;

while(j >= 1 && aj > key)

{

aj +1 = aj;

j--;

}

aj + 1 = key;

}

}

int main()

{

cin >> n;

for(int i = 1; i <= n; i++)

cin >> ai;

insert_sort();

for(int i = 1; i <= n; i++)

cout << ai << " ";

return 0;

}

选择排序(selection_sort):每次找出未排序列中最小的元素,然后放进有序序列的后面(第一步找最小,第二步交换)

const int N = 1e6 + 10;

int n;

int aN;

void selection_sort()

{

for(int i = 1; i < n; i++) //待排序列区间的首位置

{

//i,n 区间就是待排序列的区间

int pos = i;

for(int j = 1 + 1; j <= n; j++) // 查找待排序区间最小元素的下标

{

if(aj < apos)

{

pos = j;

}

}

swap(ai,apos);

}

}

int main()

{

cin >> n;

for(int i = 1; i <= n; i++)

{

cin >> ai;

}

selection_sort();

for(int i = 1; i <= n; i++)

{

cout << ai << " ";

}

return 0;

}

冒泡排序(Bubble Sort):相邻的元素在满足条件的情况下进行交换,直到没有相邻的元素需要交换为止

const int N = 1e6 + 10;

int n;

int aN;

void bubble_sort()

{

//依此枚举待排序区间的最后一个元素

for(int i = n; i > 1; i--)

{

//1,i 就是待排序区间

for(int j = 1; j <= i; j++)

{

if(aj > aj + 1)

{

swap(aj,aj + 1);

}

}

}

}

int main()

{

cin >> n;

for(int i = 1; i <= n; i++)

{

cin >> ai;

}

bubble_sort();

for(int i = 1; i <= n; i++)

{

cout << ai << " ";

}

return 0;

}

当某一趟冒泡排序中,没有执行元素的交换操作时,整个序列就是有序的了,所以没有必要再继续执行冒泡排序算法了,下面为优化后的方案代码

//优化后的冒泡排序

void bubble_sort()

{

//依此枚举待排序区间的最后一个元素

for(int i = n; i > 1; i--)

{

//1,i 就是待排序区间

for(int j = 1; j <= i; j++)

{

if(aj > aj + 1)

{

swap(aj,aj + 1);

flag = true;

}

}

if(flag = false)

return ;

}

}

堆排序(heap_sort):是指利用堆这种数据结构所设计的一种排序算法。本质上是优化了选择排序算法,如果将数据放在堆中,能够快速找到待排序元素中的最小值或最大值

创建步骤为:1、先建堆。:升序建大堆,降序建小堆。建堆过程,从倒数第一个非叶子节点开始,倒着一直到根结点位置,每个结点进行向下调整。2、排序。每次将堆顶元素与堆最后一个元素交换,堆的大小减一,然后将堆顶元素向下调整。重复上述过程,直到堆中剩下一个元素。

const int N = 1e6 + 10;

int n;

int aN;

void dowm(int parent,int len)

{

int child = parent * 2;

while(child <= len)

{

if(child + 1 <= len && achild + 1 > achild)

child++;

if(aparent,achild)

return ;

swap(aparent,achild);

parent = child;

child = parent * 2;

}

}

void heap_sort()

{

//1、建堆

for(int i = n / 2; i >= 1; i--)

//到数第一个非叶结点的序号是 n / 2

{

down(1,n); //使用down函数 进行向下调整

}

//2、排序

for(int i = n; i > 1; i--)

// 枚举堆里面最后一个元素的位置

{

swap(ai,ai);

down(1,i- 1);

}

}

int main()

{

cin >> n;

for(int i = 1; i <= n; i++)

{

cin >> ai;

}

heap_sort();

for(int i = 1; i <= n; i++)

{

cout << ai << " ";

}

return 0;

}

快速排序(quick sort):快速排序是一种效率较高的算法

算法原理分为两步:从待排区间中选择一个基准元素,按照该元素的大小将区间分成左右两部分。然后递归处理左区间和右区间,直到区间长度为1

在快排序中随机选择一个基准元素:函数:srand(time(0)):种下一个随机数种子;rand():获得一个随机数;rand %(right - left + 1) + left: 在left , right区间内,随机选择一个数

数组分两块的排序

int n;

int aN;

int get_random(int left,it right)

{

return arand() % (right - left + 1) + left;

}

int main()

{

srand(time(0));

return 0;

}

数组分三块的快排:左边全部小于基准元素,中间全部等于基准元素,右边全部大于基准元素

const int N = 1e6 + 10;

int n;

int aN;

int get_random(int left,it right)

{

return arand() % (right - left + 1) + left;

}

void quick_sort(int left,int right)

{

if(left >= right)

return ;

//1、选择一个基准元素

int p = getrandom(left,right);

//2、将数组分为三块

int l = left - 1,i = left, r = right + 1;

while(i < r)

{

if(ai < p)

swap(a++l,ai++);

else if(ai == p)

i++;

else

swap(a--r,ai);

}

//区间的划分

// left,l l + 1 , r - 1 r, right

quick_sort(left,l);

quick_sort(r,right);

}

int main()

{

srand(time(0));

cin >> n;

for(int i = 1; i <= n; i++)

cin >> ai;

quick_sort();

for(int i = 1; i <= n; i++)

cout << ai;

return 0;

}

归并排序(merge sort):无论数据有什么特性,时间复杂度就能确定的排序算法

分为两步:1、只要能分,就将区间一分为二,分到不能再分为止,然后将左右区间分别排序。2、然后将这两个区间进行合并。归并排序实际上使用递归来实现的

const int N = 1e6 + 10;

int n;

int aN;

int tmpN; //辅助归并排序时,合并两个有序数组

void merge_sort(int left,int right)

{

if(left >= right)

return ;

else

//先一分为二

int mid = (left + right) >> 1;

//区间为 left,mid mid + 1,right

//2、先让左右区间有序

merge_sort(left,mid);

merge_sort(mid + 1,right);

//3、合并两个有序数组

int cur1 = left,cur2 = min = 1,i = left;

while(cur1 <= mid && cur2 <= right)

{

if(acur1 <= acur2)

tmpi++ = acur1++;

else

tmpi++ = acur2++;

}

while(cur1 <= mid) tmpi++ = acur1++;

while(cur2 <= right) tmpi++ = acur2++;

for(int j = left; j <= right; j++)

{

aj = tmpj;

}

}

int main()

{

cin >> n;

for(int i = 1; i <= n; i++)

cin >> ai;

merge_sort();

for(int i = 1; i <= n; i ++)

cout << ai << " ";

return 0;

}

相关推荐
threerocks11 分钟前
Jev 入门第一课
算法
汉克老师1 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者1 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
西柚研究生1234561 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
天若有情6731 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_199886872 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao17338372 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳3 小时前
2026.9.17
数据结构·算法·leetcode
shada3 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++
木井巳3 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法