c++ 快速排序

快速排序的思想是使某个数在它该在的位置,然后对这个数前后两部分进行递归处理即可
例子: 6 5 79 2
6该在的位置应该在第三位 5 2 6 79
那么如何使一个数在它该在的位置呢,观察上面的例子,要使一个数在它该在的地方应该要让所有小于它的数在左边,所有大于它的数在右边即可
按照上面的思想我们可以编写代码

#include <iostream>
using namespace std;

#define N 13

template<class T>
void fastSort(T *ary,size_t len);

int main(){
	int ary[] = {4,5,7,2,46,41,4,45,4,56,64,6,4};
	fastSort(ary,N);

	for(int i = 0;i<N;i++){
		cout << ary[i] << " ";	
	}

	return 0;
}


template<class T>
void fastSort(T *ary,size_t len){
	T* t  = new T[len];
	int left = 0,right = len-1;	
	for(int i=1;i<len;i++){
		if(ary[i] < ary[0]){ //我们干脆每次都选定最左边的数为中心节点
			t[left] = ary[i];
			left++;
		}
		else{
			t[right] = ary[i];
			right--;
		}

	}

	t[left] = ary[0];
	memcpy(ary,t,sizeof(T)*len);

	delete[] t;

	if(left>1)
		fastSort(ary,left);
	size_t right_len = len-left-1; //计算右半部分的长度
	if(right_len>1)
		fastSort(ary+left+1,right_len);
}

上面fastSort函数思想很简单,首先创建一块和排序数组一样大小的内存,然后将数组内所有小于最左边的数放入内存的左边,将数组内所有大于最左边的数放入内存的右边,然后再将最左边的数放入内存的最后一个位置,这样就得到最左边的数应该放的位置。最后将这个位置的左半部分和右半部分进行递归处理,它们的长度变1就不用递归了

现在我们尝试不创建一块内存来构建算法,我们为什么要创建一块新内存呢?因为原来的数组没地方放我们比较的结果,但是上面我们观察到数组第0个位置是没有被使用的,我们可以将ary[0]暂存,然后利用这块空闲内存进行移动,由于这块内存在数组的最左边,所以我们从数组的最右边开始比较,如果该数比ary[0]大,我们就继续向前检查,这样可以保证我们检查过的数据在右边都是大于ary[0],如果该数比ary[0]小,那我们就把它移到左边空闲的位置,这样右边就有了空闲的位置,此时,我们从左边开始检查,检查到大于ary[0]的,就把它移动到右边空闲的位置,如此循环往复,从左边到右边的范围不断缩小,直至它们指向同一个位置

#include <time.h>
#include <iostream>
using namespace std;

#define N 15

//template<class T>
//void fastSort(T *ary,size_t left,size_t right);
template<class T>
void fastSort(T *ary,size_t len);

int main(){
	int ary[N];
	srand((unsigned)time(NULL));
	for(int i = 0; i < N;i++ )
		ary[i] = rand() % 100;
	fastSort(ary,N);

	for(int i = 0;i<N;i++){
		cout << ary[i] << " ";	
	}

	return 0;
}

template<class T>
void fastSort(T *ary,size_t len){
	T temp = ary[0];
	int i=0,j=len-1;
	bool turnLeft=true;
	while(i!=j){
		if(turnLeft){
			if(ary[j]>temp)
				j--;
			else{
				ary[i]=ary[j];
				i++;
				turnLeft=false;
			}
		}
		else{
			if(ary[i]<=temp)
				i++;
			else{
				ary[j]=ary[i];
				j--;
				turnLeft=true;
			}

		}
		
	}

	ary[i]=temp;
	
	if(i>1)
		fastSort(ary,i);
	size_t right_len = len-i-1;
	if(right_len>1)
		fastSort(ary+i+1,right_len);
}
posted @ 2023-04-12 04:03  乘舟凉  阅读(22)  评论(0编辑  收藏  举报