排序算法(nlogn级)

  1. 归并排序
//merge()函数是合并两个有序序列,使用了two pointers的思想,可以看看算法笔记上的记录
//将数组a的[l1,r1]与[l2,r2]区间合并成有序区间(此处l2即为 r1+1)

const int max=100;
void merge(T a[],int l1,int r1,int l2,int r2){
	int i=l1,j=l2,index=0;	//i指向a[l1],j指向a[l2]
	T temp[maxn];//temp临时存放合并后的数组,index为其下标
	while (i<=r1 && j<=r2){
		if (a[i]<=a[j]){
			temp[index++]=a[i++];//将a[i]加入序列temp
		}
		else{
			temp[index++]=a[j++];
		}
	}
	while (i<=r1){
		temp[index++]=a[i++];//将[l1,r1]的剩余元素加入序列temp
	}
	while (j<=r2){
		temp[index++]=a[j++];//将[l2,r2]的剩余元素加入序列temp
	}
	for ( i = 0; i < index; i++){
		a[l1+i]=temp[i];//将合并后的序列赋回数组a
	}
}


//将a数组当前区间[left,right]进行归并排序
//递归算法
void mergeSort(T a[],int left,int right){
	if (left<right){
		int mid=(left+right)/2;
		mergeSort(a,left,mid);	//递归,将左子区间[left,mid]归并排序
		mergeSort(a,mid+1,right);	//递归,将右子区间[mid+1,right]归并排序
		merge(a,left,mid,mid+1,right);	//将左右子区间合并
	}
}
  1. 快速排序

//此处用以划分区间的主元是 a[left] ;
//必须满足主元左边的元素都要比主元小,右边的元素比主元大
//对区间[left,right]进行划分

int Partition(T a[],int left,int right){
	T temp = a[left];	//将a[left]存放至临时变量
	
	while(left<right){	//只要left和right不相遇
		
		while(left<right && a[right]>temp){	//反复左移right
			right--;
		}
		a[left]=a[right];	//将a[right]移至a[left]处

		while(left<right && a[left]<=temp){	//反复右移 left
			left++}
		a[right]=a[left];	//将a[left]移至a[right]处
	}

	a[left]=temp;	//把temp放到 left和 right相遇的地方
	
	return left;	//返回相遇的下标
}

//快速排序对于接近有序的序列,会达到最坏时间复杂度,所以使用以下方法优化区间划分
//优化的快速排序—随机快排
//随机选取主元,对区间[left,right]进行划分
int randPartition(T a[],int left,int right){

	//生成[left,right]之间的随机数 p
	int p = rand()%(right-left+1)+l;
	swap(a[p],a[left]);	//将主元移至首位

	//以下为原先 Partition函数的划分过程,不需要改变任何东西
	int temp = a[left];
	while(left<right){

		while(left<right && a[right]>temp){
			right--;
		}
		a[left]=a[right];

		while(left<right && a[left]>=temp){
			left++;
		}
		a[right]=a[left];

		a[left]=temp;

		return left;
	}
}


//快速排序,left和right初值为序列下标首尾(例如1与 n)
//递归算法

void quickSort(T a[],int left,int right){

	if (left<right){	//当前区间长度超过 1
		
		//将[left,right]按a[left]一分为二
		int pos = Partition(a,left,right);
		quickSort(a,left,pos-1);	//对左子区间递归进行快速排序
		quickSort(a,pos+1,right);	//对右子区间递归进行快速排序
	}
	
}

你可能感兴趣的:(数据结构和算法)