数据结构之快排(山理工3398)



————————————————————————————————————————————

这个题应用了快排。。。虽然题目只要求一遍,但是回了一遍就会了全部的。。。。

先上一遍的。。。。

————————————————————————————————————————————

#include<stdio.h>
void swap(long long *x,long long *y);
int main()
{
	int n;
	long long a[100005];
	
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
			scanf("%lld",&a[i]);
			int temp=a[0];
		int x=0,y=n-1;
		while(x<y)
		{
			
			while(x<y && a[y]>=temp) y--;
			a[x]=a[y];
			while(x<y && a[x]<=temp) x++;
			a[y]=a[x];
		}
		a[x]=temp;
		for(int i=0;i<n;i++)
		printf("%lld%c",a[i],i==n-1?'\n':' ');
	
	
	}

	return 0;
}


——————————————————————————

然后再来讲一下全部的快速排序。。。。一开始学的时候没用过快排排过一直用stl库中的sort

然后做做了数据节后题发现都不会。。。。。。。。。

能写的都超时。。。所以又学了一遍几种排序的方法

——————————————————————————————————————————

快速排序的归并有相同之处就是应用了递归

void Qsort(int a[],int low,int high)
{
	int mid;
	if(low<high)
	{
		mid=Partition(a,low,high);
		Qsort(a,low,mid);
		Qsort(a,mid+1,high);
	}
	 
}
这个部分就是把把数组分成两部分。。。

一部分比比较值低,一部分比比较值高

int Partition(int a[],int low,int high)
{
	int temp;		
	temp=a[low]; 		//用表的第一个数作为比较值
	while(low<high)
	{
	
		while(low<high && a[high]>=temp) high--;
		a[low]=a[high];
		while(low<high && a[low]<=temp) low++;
		a[high]=a[low]; 
	} 
	a[low]=temp;
	return low;
	
}
这用来返回中轴值的

讲每个部分进行排序最后就排好了


#include<stdio.h>
#define N 10000
void Qsort(int a[],int low,int high);
int Partition(int a[],int low,int high);
int main()
{
	int n;
	int a[N];
	
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]); 
	Qsort(a,0,n-1);
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	
	
	return 0;
} 
void Qsort(int a[],int low,int high)
{
	int mid;
	if(low<high)
	{
		mid=Partition(a,low,high);
		Qsort(a,low,mid);
		Qsort(a,mid+1,high);
	}
	 
}
int Partition(int a[],int low,int high)
{
	int temp;		
	temp=a[low]; 		//用表的最小值数作为中轴值
	while(low<high)
	{
	
		while(low<high && a[high]>=temp) high--;
		a[low]=a[high];
		while(low<high && a[low]<=temp) low++;
		a[high]=a[low]; 
	} 
	a[low]=temp;
	return low;
	
}




posted @ 2015-12-29 21:00  hong-ll  阅读(219)  评论(0编辑  收藏  举报