一、交换排序
基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动
冒泡排序
void BubbleSort(int a[],int len)
{
for(int i=0;i<len;++i)
{
for(int j=0;j<len-i-1;++j)
{
if(a[j]>a[j+1])
{
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}
特性:
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定
快速排序
基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,知道所有元素都排列在相应位置上为止
将区间按照基准值划分为左右两半部分的常见方式有:
- hoare版本
- 挖坑法
- 前后指针法
void QuickSort(int a[],int left,int right)
{
int i=left;
int j=right;
int base=a[left];
if(left>=right)
return ;
while(i!=j)
{
while(i<j&&a[j]>=base)
j--;
if(j>i)
a[i]=a[j];
while(i<j&&a[i]<=base)
i++;
if(i<j)
a[j]=a[i];
}
a[i]=base;
QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}
特性:
快速排序整体的综合性能和使用场景比较好
时间复杂度:O(N*logN)
空间复杂度:O(logN)
稳定性:不稳定
二、归并排序
基本思想:采用分治法,将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
特性:
归并的缺点在于需要O(N)的空间复杂度
时间复杂度:O(N*logN)
空间复杂度:O (N)
稳定性:稳定