【一】直接插入排序是减治法的一种实例,较为简单,时间复杂度O(n2)。
下面用递归方法:
1.将带插入数以前的数列看做有序的。
2.由待插入数的一位开始从后往前与带插入比较直到待插数小于后数大于前数时插入。即:大于插入数的均往后移一位,插入数放在第一位后移数的原位置。
3.递归调用第2步。直到插入数位置大于数据总长时终止。
源代码:
void insertionsort(int *pArr,int index, int len)//直接插入排序算法
{
int key;
int i=0;
key = pArr[index];
if(index >= len){ return;}
for(i=index-1; i>=0 && key<pArr[i]; i--) //插入目标数,下标index
{
pArr[i+1] = pArr[i];
}
pArr[i+1] = key;
insertionsort(pArr,index+1,len);
}
【二】快速排序是分治法的一种实例,是最快的排序方法,时间复杂度为O(nlog2n)。
1.快速排序先选择一个中轴,通常是第一个数。
2.设置low和high,分为三部分,分别是小于中轴的数,中轴和大于中轴的数。
3.再将左右两边递归调用第三步,循环递归,当low=high时终止。
void QuickSort(int *pArr,int low, int high)//快速排序
{
int i = low;
int j = high;
int key = pArr[i];
if(low < high)
{
while(i < j)
{
while(key <= pArr[j] && i<j)
{
j--;
}
pArr[i] = pArr[j];
while(key >= pArr[i] && i<j)
{
i++;
}
pArr[j] = pArr[i];
}
pArr[i] = key;
QuickSort(pArr,low,i-1);
QuickSort(pArr,j+1,high);
}
else{
return;
}
}
对2000数排序,比较两种排序,插入排序用时0.005s,快速排序用时0.001s。可见快速排序还是有优势。
小编水平有限,如有错误请指出。