void InsertSort(ElemType A[]){
for( i=2;i<A.length();i++){
A[0]=A[i];
for(j=i-1;i>=1;i++){
if(A[j]<A[0]){
A[j+1]=A[j];
}else{
break;
}
}
A[j+1]=A[0];
}
}
最好情况,整个数组已经是顺序的了,O(n)
最坏情况,整个数组是逆序的,O(n^2)
平均情况,O(n^2)
是一种稳定排序
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
算法分析:时间复杂度O(nlgn)
空间复杂度O(n)
稳定排序
void select-sort(int A[],int len){
for(i=1;i<=len;i++){
key = A[i];
for(j=i+1;j<=len;j++){
if(A[j]<key){
pos=j;
key=A[j];
}
}
tmp=A[pos];
A[pos]=A[i];
A[i]=tmp;
}
}
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于交换和记录索引)
稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
原文:http://blog.csdn.net/ysgcreate/article/details/44541265