排序Vol2
排序:笔试和面试的重点.1.算法描述;2.实现;3.效率分析(时间复杂度,空间复杂度,稳定性)
稳定性:针对关键字相同的数据,排序前如果A在A"的前面,排序后还能保证A在A"的前面,则算法稳定,否则不稳定
稳定性判断依据:有没有跳跃的交换数据,没有则稳定
2.希尔排序(Shell)
代码思想:间隔式的分组,利用插入排序让组内有序,然后缩小分组再排,直到组数为1,则全部有序
时间复杂度:O(n^1.3~ n^1.5)
空间复杂度:O(1)
稳定性:不稳定(跳跃)
//一趟shell过程,gap为间隔
static void Shell(int *arr,int len,int gap)
{
int tmp;
int j;
for(int i=gap;i<len;i+=gap)//从同间隔组的第二个数据开始
{
tmp=arr[i];
j = i - gap;
//每一趟使用插入排序
while(j>=0 && arr[j] > tmp)
{
arr[j+gap] = arr[j];
j-=gap;
}
arr[j+gap]=tmp;
}
}
void ShellSort(int *arr,int len)//O(n^1.3~n^1.5),O(1),不稳定(跳跃)
{
//初始增量:len/2,每一趟之后除以2
for(int inc = len/2;inc > 1;inc/=2)
{
Shell(arr,len,inc);
}
}