No.3 快速排序

桶排序,浪费空间,冒泡排序,时间复杂度高,“快排”应该是一种比较好的排序算法,既省空间又降低了时间复杂度,它的时间复杂度是O(Nlog⁡N),但是在最坏的情况下它的时间复杂度和冒泡排序一样为O(N^2)。

假设我们要给“8 2 3 5 1 6 4 10 9 7”这样一组数排序,利用“快排”。首先从这组数中选出一个数作为基准数,通常我们选择第一个数,然后我们需要将这个序列中所有比基准数大的数放在基准数的右边,比基准数小的数放在基准数的左边。

在此序列中,我们选8作为基准数,先从右往左找找一个比8小的数,再从左往右找找一个比8大的数,然后把这两个数进行交换。定义两个变量i和j,分别指向序列的最左边的数8和最右边的数7,然后从右往左找(j–)直到找到一个比8小的数,然后从左往右找一个比8大的数(i++)直到找到一个比8大的数,最后j指向7,i指向10,交换7和10,交换后序列为“8 2 3 5 1 6 4 7 9 10”,然后j继续向左找(j–),最后指向7,但是此时i和j指向同一个位置,所以要将7和基准数8进行交换,让基准数归位,第一轮结束后序列为“7 2 3 5 1 6 4 8 9 10”,以8为分界点,再分别对8左边的数和右边的数进行上述操作,直到出现不可拆分的新的子序列为止,即所有的数均按要求排好。用c还是很容易实现的,不过程序好像有点问题,不是bug,没有报错,它就是傲娇地不想排而已。

#include 

int a[100];//定义一个数组用于存储要排序的数 
void quicksort(int left,int right){
	int i,j,t,temp;//temp用于临时存储选定的基准数 
	if(left>right) 
	   return;
	
	temp=a[left];//选定要排序序列最左边的数作为基准数并存储在变量temp中 
	i=left;//i,j分别处于序列的最左边和最右边的位置 
	j=right;
	
	while(i!=j){
		//从右边向左边开始找 
		while(a[j]>=temp && i

“快排”比冒泡排序快是因为它每次交换都是跳跃式的,而冒泡排序每次只能让相邻的进行交换,所以“快排”交换次数少,效率高,但是最坏的情况就是每次只能交换相邻的数,这就和冒泡排序一样了。

你可能感兴趣的:(排序,算法)