//冒泡排序,选择排序,插入排序,希尔排序,快速排序和归并排序
#include <bits/stdc++.h>
using namespace std;
int x[10000];
int y[10000];
//1.冒泡排序(已优化),冒泡排序主要是遍历一个一个比较,将大小不符合的两个数交换位置
//输入长度,与待排序数组
//其优化为减少重复排序次数
//时间复杂度o(n^2)
void mp_sort (int* x,int size)
{
for (int i = 0; i < size - 1; i++)
{
for (int j = 0; j < size - i - 1; j++)
{
if (x[j] > x[j + 1])
swap(x[j],x[j + 1]);
}
}
}
//2.选择排序
//一个一个遍历,找到最小的那个,与第一个互换,然后继续遍历,与第二个互换,直到排序结束
//时间复杂度o(n^2)
void choose_sort(int* x,int size)
{
for (int i = 0; i < size; i++)
{
int m = 123456,n;//n来记录最小的位置 ,m是定义的一个较大值
for (int j = i; j < size; j++)
{
if (x[j] < m)
m = x[j],n = j;
}
swap(x[i],x[n]);
}
}
//3.插入排序
//插入排序是用一个指针从前往后,然后在每一次指针位置更新时从后往前遍历,遇到比其大的就交换位置
//时间复杂度o(n^2)
void insert_sort(int* x,int size)
{
for (int i = 0; i < size ; i++)
{
for (int j = i; j >= 1; j--)
{
if (x[j] < x[j - 1])
swap(x[j],x[j - 1]);
}
//也可以这么写
/*
int j = i;
while (j >= 1 && x[j] < x[j - 1])
{
swap(x[j],x[j - 1]);
j--;
}
*/
}
}
//4.希尔排序
//希尔排序可以理解为插入排序的一种优化,就是利用了分治的思想,将其分组,多次插入排序
//希尔排序的时间复杂度取决与增量的选取,最大为o(n^2)最小为o(nlogn)
//在这里介绍最原始的shell
void shell_sort(int* x,int size)
{
for (int gap = (size/2); gap > 0; gap /= 2)//分组
{
for (int i = gap; i < size; i++)
{
for (int j = i; j >= gap ; j -= gap)
{
if (x[j] < x[j - gap])
swap(x[j],x[j-gap]);
}
}
}
}
//-------------------------------------------------------------------------------------
//5.快速排序
//快速排序就要用到双指针算法,其分两种,一种是对撞指针型,一种是前后指针型,且属于未优化型
//这里分别将两种列出
//对撞指针型
void quick_sort1(int* x,int left,int right)
{
if (left >= right)
return;
int i = left,j = right,mid = x[(left + right)/2];//mid是基准数
while(i <= j)
{
while(x[i] < mid)
i++;
while(x[j] > mid)
j--;
if (i <= j)
{
swap(x[i],x[j]);//创建第三方变量可以交换更快
i++;
j--;
}
}
//排完后有left<=j<i<=right
quick_sort1(x,left,j);//j
quick_sort1(x,i,right);//如果此时不是i,是j+1,则会有可能重新打乱
}
//6.归并排序
//归并排序就是把数组分为最小的一个个部分,就如长度为n的数组,当划分次数最多时,就是n组
//然后再一个一个比较且合并
//将x数组排序后存放再y数组里面
void marge_sort(int* x,int* y,int left,int right)
{
//用递归不断分组分组
if (left >= right)
return;
int mid = (left + right)/2;
marge_sort(x,y,left,mid);
marge_sort(x,y,mid+1,right);
int i = left,j = mid + 1;
int t = left;//遍历比较
while(i <= mid && j <= right)
{
if (x[i] < x[j])
{
y[t++] = x[i++];
}
else
{
y[t++] = x[j++];
}
}
while (i <= mid)//处理剩余部分
y[t++] = x[i++];
while (j <= right)
y[t++] = x[j++];
for ( i = left; i <= right; i++)
{
x[i] = y[i];//将y数组的数字给到x数组,因为y数组还要继续使用
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> x[i];
}
int i = 0;
marge_sort(x,y,i,n - 1);
for (int i = 0; i < n; i++)
{
cout << x[i] << " ";
}
return 0;
}
冒泡排序,选择排序,插入排序,希尔排序,快速排序和归并排序
最新推荐文章于 2025-12-16 14:17:05 发布
69万+

被折叠的 条评论
为什么被折叠?



