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;

}

相关推荐
happymaker062625 分钟前
LeetCodeHot100——155.最小栈
算法
洛水水35 分钟前
【力扣100题】85.每日温度
算法·leetcode·职场和发展
Coder-magician39 分钟前
《代码随想录》刷题打卡day15:二叉树part05
数据结构·c++·算法
Kurisu_红莉栖40 分钟前
力扣56合并区间
算法·leetcode
Irissgwe1 小时前
算法的时间复杂度和空间复杂度
数据结构·c++·算法·c·时间复杂度·空间复杂度
随意起个昵称1 小时前
区间dp-基础题目3(永别)
c++·算法
周末也要写八哥1 小时前
有向图Hierholzer算法的另一种实现
算法
bIo7lyA8v1 小时前
算法调优中的性能回归与基准测试分析的技术8
算法·数据挖掘·回归
有点。1 小时前
C++贪心算法二(练习题)
c++·算法·贪心算法
西安邮电大学1 小时前
贪心算法详细讲解
java·后端·其他·算法·面试