《算法导论》排序算法 (一)

2014-11-24 02:39:48 · 作者: · 浏览: 2

看《算法导论》写的部分代码,做个记录。


[cpp]
#include
#include
#include
#define maxNumber 100000000;
/*------------------------------------------------------------------------
*《算法导论》第2-7章涉及到的部分算法:
* 插入排序+合并排序+堆排序+快速排序
*Version1.0: 2013/04/27
*Version2.0目标:1.增加其他排序算法:冒泡排序+计数排序等
* 2.增加更多类型支持,不限于std::vector
*------------------------------------------------------------------------*/

//------------插入排序算法-----------------
void InsertionSort(std::vector &A){
int len = A.size();
int i;
for (int j=1;j int key = A[j];
i = j-1;
while (i>=0 && A[i]>key){
A[i+1] = A[i];
--i;
}
A[i+1] = key;
}
};


//------------合并排序---------------------
void Merge(std::vector &A, int p, int q, int r){
int n1 = q-p+1;
int n2 = r-q;
std::vector L(n1+1);
std::vector R(n2+1);
int i,j;
for ( i=0; i for ( j=0; j L[n1] = maxNumber;
R[n2] = maxNumber;
i = 0;
j = 0;
for (int k =p; k<=r;++k){
if (L[i]<=R[j]){
A[k]=L[i];
++i;
}
else{
A[k] = R[j];
++j;
}
}
};

void MergeSort(std::vector &A, int p, int r){
int q;
if (p q = (int)floor(double((p+r)/2));
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
};


//------------堆排序--------------------------
int LEFT(int i){
return (2*(i)+1); //与书中不同,C++从0开始
};
int RIGHT(int i){
return (2*(i)+2);
};

void MaxHeapify(std::vector &A, int i,int heap_size){
int l = LEFT(i);
int r = RIGHT(i);
int largest;
if (lA[i])
largest = l;
else
largest = i;
if (rA[largest])
largest = r;
if (largest != i){
std::swap(A[i],A[largest]);
MaxHeapify(A, largest, heap_size);
}
};

void BuildMaxHeap(std::vector &A){
int heap_size = A.size();
for (int i = (int)floor(double(A.size()/2)); i>=0; --i)
MaxHeapify(A,i,heap_size);
}

void HeapSort(std::vector &A){
BuildMaxHeap(A);
int heap_size = A.size(); //
for (int i = A.size()-1;i>=1;--i){
std::swap(A[0],A[i]);
heap_size = heap_size-1;
MaxHeapify(A,0,heap_size);
}
}


//------------快速排序-----------------------------
int Partition(std::vector &A, int p, int r){
int x = A[r];
int i = p-1;
for (int j=p;j if (A[j]<=x){
++i;
std::swap(A[i],A[j]);
}
}
std::swap(A[i+1],A[r]);
return i+1;
};

void QuickSort(std::vector &A, int p, int r){
if (p int q = Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
};

#include
#include
#include
#define maxNumber 100000000;
/*------------------------------------------------------------------------
*《算法导论》第2-7章涉及到的部分算法:
* 插入排序+合并排序+堆排序+快速排序
*Version1.0: 2013/04/27
*Version2.0目标:1.增加其他排序算法:冒泡排序+计数排序等
* 2.增加更多类型支持,不限于std::vector
*------------------------------------------------------------------------*/

//------------插入排序算法-----------------
void InsertionSort(std::vector &A){
int len = A.size();
int i;
for (int j=1;j int key = A[j];
i = j-1;
while (i>=0 && A[i]>key){
A[i+1] = A[i];
--i;
}
A[i+1] = key;
}
};


//------------合并排序---------------------
void