数据结构 快速排序(详解)

  快速排序

1:快速排序的思想

    快速排序运用了分治的思想,即通过一趟排序 将序列分为两部分,根据选取的基准, 将比基准小的数放在基准前面,将比基准大的数放在的数放在基准后面;然后对两部分进行递归处理,以达到整个序列有序的状态。

2:快速排序的步骤

   (1):选择基准 在一个待排序列中找一个 待排的数作为基准;

   (2):分割操作 根据基准将序列分为两部分 

   (3):将分割后的序列进行递归操作;

3:选择基准的方法

(1):固定基准:即选取序列的第一个数或最后一个数作为基准;(耗费时间长)

(2):三数取中:即将序列中的首 中 尾 三个数 取出来 进行比较取 中间那个数;

4:运算最快的代码组合之一

    三数取中 + 插排 

#include
 
void swap(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}
 
//插入排序
void Insertion_sort(int A[], int low, int high){
	int P,i;                      
	int N = high - low;
	for(P = 1; P < N; P++){
		int temp = A[P];
		for(i = P; i > 0 && A[i-1] >= temp; i--){
			A[i] = A[i-1];
			A[i-1] = temp; 
		}
	}
}
//选取 一个基准 进行 分成两部分 
 
//使用三数取中法选择枢轴 
//int  getstandard(int A[], int i, int j){
//	
//	int mid = i + ((j - i) >> 1);//计算数组中间的元素的下标
// 
//	//使用三数取中法选择枢轴
//	if (A[mid] > A[j])//目标: arr[mid] <= arr[high]
//	{
//		swap(A[mid],A[j]);
//	}
//	if (A[i] > A[j])//目标: arr[low] <= arr[high]
//	{
//		swap(A[i],A[j]);
//	}
//	if (A[j] > A[i]) //目标: arr[low] >= arr[mid]
//	{
//		swap(A[mid],A[i]);
//	}
//	//此时,arr[mid] <= arr[low] <= arr[high]
//	int key = A[i];
//	//low的位置上保存这三个位置中间的值
//	//分割时可以直接使用low位置的元素作为枢轴,而不用改变分割函数了
//	
//	while(i < j){
//		
//		while(i < j && A[j] >= key){
//			j--;
//		} 
//		if(i < j && A[j] < key){
//			A[i] = A[j];
//		}
//		
//		while(i < j && A[i] <= key){
//			i++;
//		}
//		if(i < j && A[i] > key){ //前面的数如果大于key的话 就将前面的数放到后面?
//			A[j] = A[i];
//		}
//	} 
//	//出这个循环  
//    A[i] = key;
//    return i ;
//}
 //此为选取第一个 数据作为基准 
int  getstandard(int A[], int left, int right){
	int i = left,j = right;
	int key = A[left];//选取 第一个数据为基准
	
	while(i < j){
		
		while(i < j && A[j] >= key){
			j--;
		} 
		while(i < j && A[i] <= key){
			i++;
		}
		//当发现 从右边开始发现有比基准数小的时候,从左边开始 遇到比基准数大的时候
		//交换两个数 
		if(i < j){
			swap(A[i],A[j]);
		}
			
	} 
	//出这个循环  交换基准数  和 i 与 j 相等时那个位置的数 
    A[left] = A[i];
    A[i] = key;
    
    return i; 
}
 
void QuickSort(int A[] ,int low ,int high){
	if(low < high){
		int standard = getstandard(A, low, high);
		//递归两部分   
		QuickSort(A, low, standard-1);
	    QuickSort(A, standard+1, high);              
	}
	//当数据小于10的时候选择插入排序明显 比 快排速度更快 
	if(high - low < 10)
	 Insertion_sort(A, low, high);
}
int main(){
	int i,n;
	scanf("%d",&n);
	int a[n];
	for(i=0; i

你可能感兴趣的:(算法,快速排序,排序算法,数据结构)