寒假训练 第八节 基础算法 总结

插入排序

实现步骤:

首先对数组的前两个数据进行从小到大的排序。
接着将第3个数据与排好序的两个数据比较,将第3个数据插入到合适的位置。
然后,将第4个数据插入到已排好序的前3个数据中。
不断重复上述过程,直到把最后一个数据插入合适的位置。最后,便完成了对原始数组从小到大的排序。

实现过程:
在这里插入图片描述
实现代码:

#include<iostream>
#include<algorithm>
using namespace std;
void chaRuSort(int arr[], int len){
        int i,j,x;
        for (i=1;i<len;i++){
                x = arr[i];
                j=i-1;
                while((j>=0) && (arr[j]>x)){
                        arr[j+1] = arr[j];
                        j--;
                }
                arr[j+1] = x;
        }
}


void out(int arr[],int len)
{
	for(int i=0;i<len;i++){
		cout<<arr[i]<<" "; 
	}
	
} 

int main(){
	int arr[] = {12,45,1,34,56,89,24,6,96,57,59,2};
	int len = sizeof(arr)/sizeof(int);
	 chaRuSort(arr,len);
	 out(arr,len);
	return 0;	

return 0;
}

时间复杂度

在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为 。

最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(N2) 。

平均来说,A[1…j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数 。

空间复杂度

插入排序的空间复杂度为常数阶 。

优点:稳定,快

缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候

插入排序优化:

二分插入排序

二分插入排序也是插入排序算法的一种,其基本思想是:引入二分查找的思想,在直接插入排序的基础上减少比较次数,从而更快的找到插入位置。

/*
二分插入排序算法(升序)
 */
#include<iostream>
#include<algorithm>

void binSort(int *a,int len);
void binSort(int *a,int len)
{
    int mid,left,right,temp;
    for(int i=1;i<len;i++)
    {
        left = 0;//初始化已拍好序的左边界为0
        right = i-1;//右边界为待排序元素的前一个位置
        temp = a[i];//待排序元素
        while(left<=right)
        {
            mid = (left+right)/2;//计算中间位置
            if(temp<a[mid])
            {
                right = mid-1;//如果比中间位置小则缩小右边的范围为mid-1
            }
            else
            {
                left = mid+1;//如果比中间位置大则扩大右边的范围为mid+1,
            }
        }
        for(int j=i-1;j>=left;j--)
        {
            a[j+1] = a[j];//将大于等于左边界值的元素全部后移
        }
        if(left!=i)
        {
            a[left] = temp;//待插入元素插入位置不等于现在所处位置时,则插入空处
        }
    }
}

int main()
{
    iint arr[] = {12,45,1,34,56,89,24,6,96,57,59,2};
	int len = sizeof(arr)/sizeof(int);
    binSort(a,len);
    for(int i=0;i<len;i++)
    {
    	cout<<a[i];
    }
    cout<<"\n";
    return 0;
}

vector容器

vector容器存放在模板库:#include里,使用前需要先开这个库。
vector容器的声明遵循C++STL的一般声明原则

vector容器的使用方法

vec.begin(),vec.end()	返回vector的首、尾迭代器
vec.front(),vec.back()	返回vector的首、尾元素
vec.push_back()	        从vector末尾加入一个元素
vec.size()	            返回vector当前的长度(大小)
vec.pop_back()	        从vector末尾删除一个元素
vec.empty()				返回vector是否为空,1为空、0不为空
vec.clear()				清空vector
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值