1.直接插入排序
思路:例如54321这样一个序列我们将A[1]默认为有序区(我们将A[0]作为暂存单元) 那么在排序过程中我们从第二个元素开始依次插入有序区 若待插元素小于前一个元素 就将前面的元素依次后移 直到找到合适位置
void InsertSort(int A[],int length)//用0号单元暂存待排元素
{
for(int i=2;i<=length;i++)//从2号元素开始筛选
{
A[0] = A[i];//待插元素放在A[0]
for(int j = i-1;A[0]<A[j];j--)//将元素依次后移
{
A[j+1] = A[j];
}
A[j+1] = A[0];//插入待插元素
}
}
时间复杂度:o(n^2);
空间复杂度:1
2.希尔排序(0号作为暂存单元)
for(int d= n/2;d>=1;d=d/2)
{
for(int i = d+1;i<=n;i++)
{
A[0] = A[i;
for(int j =i-d;j>0&&A[0]<A[j];j=j-d)
{
A[j+d] = A[j];
}
A[j+d] = A[0];
}
}
}
3.气泡排序
exchange = n;
while(exchange!=0)
{
int bound = exchange;
exchange = 0;
for(int i=1;i<bound;i++)
{
if(A[i]>A[i+1])
{
//交换A[i]和A[i+1]的位置
}
}
exchange = i;
}
时间复杂度:O(n^2)
4.快速排序
int quickSort(int A[],int begin,int end )
{
while(begin<end)
{
//右侧扫面
while(begin<end&&A[end]>A[begin])
{
--end;
}
if(begin<end)
{
//A[first]和A[end]互换
++first
}
//左侧扫描
while(begin<end&&A[end]>A[begin])
{
++first;
}
if(begin<end)
{
//A[first]和A[end]互换
--end;
}
return first;
}
}
void Qs(int A[],int first,int end)
{
while(first<end)
{
int pivot = quickSort(A,first,end);
Qs(A,first,pivot-1);//左子树
Qs(A,pivot+1,end);//右子树
}
}
时间复杂度;O(nlog2n);
空间复杂度:O(log2n);
5.简单选择排序
for(int i=1;i<n;i++)
{
int index = i;
for(int j = i+1;i<=n;i++)
{
if(A[i]<A[intdex])
{
index = j;
}
if(index!=i)
{
//A[i]和A[index]对换
}
}
}
时间复杂度:O(n2);