插入排序
实现步骤:
首先对数组的前两个数据进行从小到大的排序。
接着将第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