鄙人实属菜鸡,学习算法是谓不自量力,仅仅是记录下学习的过程,可能无甚参考价值。
插入排序:
INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
//Insert A[j] into the sorted sequence A[1..j-1].
i = j-1
while i > 0 and A[i] > key
A[i+1]=A[i]
i=i-1
A[i+1]=key
C语言实现:
void InsertSort(int A[6])
{
int i,j,key;
for(j=2;j<=6;j++) //从2开始一直到数组尾部,排列好前面的数列
{
key=A[j]; //此刻要插入的数字
i=j-1; //key前面的一位
/*key历次与前面的数字进行比较,如果与前面的一位比较结果是前者大,
那么把前者放到后面,否则key向后移动*/
while((i>=0) && (A[i]>key))
{
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
}
}
融合排序:
MERGE(A, p, q, r)
n1 = q-p+1
n2 = r-q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = A[q+j]
L[n1+1] = inf
R[n2+1] = inf
i=1
j=1
for k = p to r
if L[i] <= R[j]
A[k] = L[i]
i = i+1
else A[k] = R[j]
j = j+1
MERGE-SORT(A,p,r)
if p < r
q = [(p+r)/2]
MERGE-SORT(A,p,q)
MERGE-SORT(A,q+1.r)
MERGE(A,p,q,r)
C语言实现:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void Merge(int A[],int p,int q,int r)
{
int i,j,k,n1,n2;
int L[SIZE],R[SIZE];
n1=q-p+1;
n2=r-q;
for(i=0;i<n1;i++)
L[i]=A[p+i];
for(j=0;j<n2;j++)
R[j]=A[q+1+j];
L[n1]=9999;
R[n2]=9999;
i=0;
j=0;
for(k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i=i+1;
}else
{
A[k]=R[j];
j=j+1;
}
}
}
void MergeSort(int A[],int p, int r)
{
int q;
if(p<r)
{
int q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
}
int main()
{
int i,b[]={8,3,5,1,4,9,2,7,20,0};
MergeSort(b,0,SIZE-1);
for(i=0;i<SIZE;i++)
printf("%d ",b[i]);
return 0;
}