交换排序(冒泡、快速)

文章目录

一、 交换排序的思路

二、冒泡排序

三、快速排序

一、 交换排序的思路

在这里插入图片描述

/*交换函数*/
void swap(int a[],int i,int j)
{
	int temp=a[i];
	a[i]=a[j];
	a[j]=temp;
}

二、冒泡排序

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

/*冒泡排序优化版*/
void BubbleSort()
{
	int i,j;
	int flag=1;
	for(i=1;i<n;i++)
	{
		flag=0;
		for(j=i+1;j<=n;j++)
		{
			if(a[i]>a[j])
			{
			swap(a,i,j);
			flag=1;	
			}	
		}
	}
}

三、快速排序

通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的。

在这里插入图片描述
在这里插入图片描述

三数区中:三个关键字先进行排序,将中间数作为枢轴,一般是取左端。右端和中间三个数。

/*快排*/

int Partition(int A[],int low,int high)
{
	int pivot=A[low];
	while(low<high){
		while(low<high&&A[high]>=pivot)
			high--;
		A[low]=A[high];
		while(low<high&&A[low]<=pivot)
			low++;
		A[high]=A[low];
	}
	A[low]=pivot;
	return low;
}

void QuickSort(int A[],int low,int high)
{
	if(Cutoff<=(Right-Left)){
	/*
	if(low<high){
		int pivotpos=Partition(A,low,high);
		QuickSort(A,low,pivotpos-1);
		QuichSort(A,pivotpos+1,high);
		
	}
	*/
	while(low<high){
		int pivotpos=Partition(A,low,high);
		QuickSort(A,low,pivotpos-1);
		low=pivotpos+1;
	}
	}
	else
		Insertion_Sort(A);
}
/*快排优化*/
int Median3(int A[],int Left,int Right)
{
	int Center=(Left+Right)/2;
	if(A[Left]>A[Center])
		Swap(&A[Left],&A[Center]);
	if(A[Left]>A[Right])
		Swap(&A[Left],&A[Right]);
	if(A[Center]>A[Right])
		Swap(&A[Center],&A[Right]);
	Swap(&A[Center],&A[Right-1]);
	return A[Right-1];
	
}

void Quicksort(int A[],int Left,int Right)
{
	if(Cutoff<=(Right-Left)){
		Pivot=Median3(A,Left,Right);
		i=Left;j=Right-1;
		for(;;){
			while(A[++i]<Pivot){}
			while(A[--j]>Pivot){}
			if(i<j)
			Swap(&A[i],&A[j]);
			else break;
		}
		Swap(&A[i],&A[Right-1]);
		Quicksort(A,Left,i-1);
		Quicksort(A,i+1,Right);
	}
	else
		Insertion_Sort(A+Left,Right-Left+1);
} 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了72 篇原创文章 · 获赞 2 · 访问量 1646

猜你喜欢

转载自blog.csdn.net/weixin_45821690/article/details/105333789