冒泡排序,选择排序,插入排序,希尔排序,快速排序和归并排序

//冒泡排序,选择排序,插入排序,希尔排序,快速排序和归并排序 
#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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值