常见排序算法-初步整理

1、插入排序

作用域慢慢扩大,始终保持作用域中的元素有序

时间复杂度:O(n^2)

空间复杂度:O(1)

#include <iostream>
 
using namespace std;
 
void sort(int *arr,int length)    //传入数组首地址和数组长度
{
    int cur, preindex;                 //定义要插入的值和比较元素的下标
    for (int i = 1; i < length; i++)  //一共需要循环 n-1 轮
    {
        cur = arr[i];             //插入的元素
        preindex = i - 1;         //从插入元素的前一个元素开始比较 
        while (cur < arr[preindex] && preindex >= 0)  //若元素大于插入元素
        {
            arr[preindex + 1] = arr[preindex];       //元素向后移
            --preindex;
        }
        arr[preindex + 1] = cur;       //把插入元素插到相应位置
    }
}
 
int main()
{
    int arra[] = {12,12,54,1745,45,45,469,789,789};
    int length = sizeof(arra) / sizeof(arra[0]);    //计算数组长度
    sort(arra,length);                     //调用排序算法  
    for (size_t i = 0; i < length; i++)    //输出排序后的数组
        cout << arra[i] << " ";
    system("pause");
    return 0;
}

2、冒泡排序

两两比较,将最大的元素放到末尾,并使作用域慢慢变小。

时间复杂度为:O( n^2 ) ;
空间复杂度:
空间复杂度就是在交换元素时那个临时变量所占的内存空间;
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);

	unsigned int size = 5;	//定义数组大小
	int testArray[5] = { 4, 1, 2, 6, 8 };	//创建数组
	for (int i = 1; i < size; i++)	//外层循环
	{
		for (int j = 0; j < size - i; j++)	//内层循环
		{
			if (testArray[j]>testArray[j + 1])	//交换条件
			swap(testArray[j], testArray[j + 1]);
		}
	}
	for (int sp : testArray)	//遍历数组
	{
		cout << sp <<"	";	//输出结果
	}

 3、选择排序

在序列中,选择最小的元素放在最前面,并逐步缩小作用域。其与冒泡排序不同的是:冒泡排序两两比较,选择较大的数、而选择排序是每次直接在作用域中遍历,寻找最小的元素,将其置前。

时间复杂度:O(n)

空间复杂度:O(1)

n = arr.size();
for(int i = 0;i < n-1;i++){
    int min = 1;
    for(int j = i + 1;j < n;j++){
        if(arr[j] < arr[min]){
            min = j;
        }
        swap(arr[i],arr[min]);
    }
}

4、归并排序

因为将两个完成排序的序列,整体进行排序会简单很多,归并排序就是这个思想,其将序列不断二分,并在将其回溯的时候完成对每个小序列的排序,之后便实现了整个数组的排序工作。

时间复杂度:O(nlog2n)

空间复杂度:O(n)

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n,a[12000],b[12000];
void merge(int low,int mid,int high)
{
	int i=low,j=mid+1,k=low;
	while (i<=mid && j<=high)
	{
		if (a[i]<a[j])
			b[k++]=a[i++];
		else
			b[k++]=a[j++];
	}
	while (i<=mid)
		b[k++]=a[i++];
	while (j<=high)
		b[k++]=a[j++];
	for (int i=low;i<=high;i++)
		a[i]=b[i];
}
void mergesort(int x,int y)
{
	if (x>=y) return;
	int mid=(x+y)/2;
	mergesort(x,mid);
	mergesort(mid+1,y);
	merge(x,mid,y);
}
int main()
{
	cin >>n;
	for (int i=1;i<=n;i++)
		cin >>a[i];
	mergesort(1,n);  //调用函数
	for (int i=1;i<=n;i++)
		cout <<a[i] <<" ";
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值