C++ 排序

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

const int N = 1e6 + 10;

int n;

int a[N];

void insert_sort()

{

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

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

{

int key = a[i];

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

int j = i - 1;

while(j >= 1 && a[j] > key)

{

a[j +1] = a[j];

j--;

}

a[j + 1] = key;

}

}

int main()

{

cin >> n;

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

cin >> a[i];

insert_sort();

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

cout << a[i] << " ";

return 0;

}

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

const int N = 1e6 + 10;

int n;

int a[N];

void selection_sort()

{

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

{

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

int pos = i;

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

{

if(a[j] < a[pos])

{

pos = j;

}

}

swap(a[i],a[pos]);

}

}

int main()

{

cin >> n;

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

{

cin >> a[i];

}

selection_sort();

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

{

cout << a[i] << " ";

}

return 0;

}

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

const int N = 1e6 + 10;

int n;

int a[N];

void bubble_sort()

{

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

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

{

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

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

{

if(a[j] > a[j + 1])

{

swap(a[j],a[j + 1]);

}

}

}

}

int main()

{

cin >> n;

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

{

cin >> a[i];

}

bubble_sort();

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

{

cout << a[i] << " ";

}

return 0;

}

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

//优化后的冒泡排序

void bubble_sort()

{

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

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

{

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

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

{

if(a[j] > a[j + 1])

{

swap(a[j],a[j + 1]);

flag = true;

}

}

if(flag = false)

return ;

}

}

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

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

const int N = 1e6 + 10;

int n;

int a[N];

void dowm(int parent,int len)

{

int child = parent * 2;

while(child <= len)

{

if(child + 1 <= len && a[child + 1] > a[child])

child++;

if(a[parent],a[child])

return ;

swap(a[parent],a[child]);

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(a[i],a[i]);

down(1,i- 1);

}

}

int main()

{

cin >> n;

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

{

cin >> a[i];

}

heap_sort();

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

{

cout << a[i] << " ";

}

return 0;

}

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

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

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

数组分两块的排序

int n;

int a[N];

int get_random(int left,it right)

{

return a[rand() % (right - left + 1) + left];

}

int main()

{

srand(time(0));

return 0;

}

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

const int N = 1e6 + 10;

int n;

int a[N];

int get_random(int left,it right)

{

return a[rand() % (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(a[i] < p)

swap(a[++l],a[i++]);

else if(a[i] == p)

i++;

else

swap(a[--r],a[i]);

}

//区间的划分

// [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 >> a[i];

quick_sort();

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

cout << a[i];

return 0;

}

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

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

const int N = 1e6 + 10;

int n;

int a[N];

int tmp[N]; //辅助归并排序时,合并两个有序数组

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(a[cur1] <= a[cur2])

tmp[i++] = a[cur1++];

else

tmp[i++] = a[cur2++];

}

while(cur1 <= mid) tmp[i++] = a[cur1++];

while(cur2 <= right) tmp[i++] = a[cur2++];

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

{

a[j] = tmp[j];

}

}

int main()

{

cin >> n;

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

cin >> a[i];

merge_sort();

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

cout << a[i] << " ";

return 0;

}

相关推荐
未来之窗软件服务1 小时前
幽冥大陆(一百12)js打造json硬件管道——东方仙盟筑基期
开发语言·javascript·算法·json·仙盟创梦ide·东方仙盟·东方仙盟算法
EverestVIP2 小时前
c++前置声明的方式与说明
开发语言·c++
放下华子我只抽RuiKe52 小时前
AI大模型开发-实战精讲:从零构建 RFM 会员价值模型(进阶挑战版)
人工智能·深度学习·算法·机器学习·数据挖掘·数据分析·聚类
Nontee2 小时前
Leetcode Top100答案和解释 -- Python版本(链表)
算法·leetcode·链表
老约家的可汗3 小时前
C++篇之类和对象下
java·开发语言·c++
Mr_WangAndy3 小时前
C++数据结构与算法_排序算法
c++·排序算法·基础排序·高级排序
niuniudengdeng3 小时前
六面独立转动魔方还原机器人设计与实现
数学·算法·机器人
ghie90903 小时前
基于MATLAB的A*算法避障路径规划实现
人工智能·算法·matlab