《算法导论》排序算法

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

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

//------------插入排序算法-----------------
void InsertionSort(std::vector<int> &A){
	int len = A.size();
	int i;
	for (int j=1;j<len;++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<int> &A, int p, int q, int r){
	int n1 = q-p+1;
	int n2 = r-q;
	std::vector<int> L(n1+1);
	std::vector<int> R(n2+1);
	int i,j;
	for ( i=0; i<n1; ++i) L[i]=A[p+i];
	for ( j=0; j<n2; ++j) R[j]=A[q+j+1];
	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<int> &A, int p, int r){
	int q;
	if (p<r){
		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<int> &A, int i,int heap_size){
	int l = LEFT(i);
	int r = RIGHT(i);
	int largest;
	if (l<heap_size && A[l]>A[i]) 
		largest = l;
	else 
		largest = i;
	if (r<heap_size && A[r]>A[largest]) 
		largest = r;
	if (largest != i){
		std::swap(A[i],A[largest]);
		MaxHeapify(A, largest, heap_size);
	}
};

void BuildMaxHeap(std::vector<int> &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<int> &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<int> &A, int p, int r){
	int x = A[r];
	int i = p-1;
	for (int j=p;j<r;++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<int> &A, int p, int r){
	if (p<r){
		int q = Partition(A,p,r);
		QuickSort(A,p,q-1);
		QuickSort(A,q+1,r);
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值