快速排序(未完结)

正常的选择、冒泡排序,时间复杂度为O(nn)
快速排序 平均为:O(n×log(n)) 最坏:O(n
n)

就是将数组按照 其中的一个元素(基准值)进行分割,分割为两个部分:大于基准值和小于基准值
因为此时第一次排完序只是将数组分割,而被分割的部分并不一定是从小到大排序,所以需要下一次的对两个分割部分在进行各自的 找基准值+分割 。。。成为一个递归的过程
而递归的出口就是基准值下标的 左下标 >= 右下标

#include <stdio.h>

void quickSort(int* array, int left, int right);

int partsort(int* array, int left, int right);

int main()
{
	int i, array[100];
	int n;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &array[i]);
	}
	quickSort(array, 0, n - 1); 
	for (i = 0; i < n; i++) {
		printf("%d ", array[i]);
	} 
	
	return 0;
}

void quickSort(int* array, int left, int right)
{ 
	//递归出口 
	if (left >= right) {
		return;
	}
	//返回基准值的位置 ,也就是此次的中点位置 
	int Index = partsort(array, left, right);
	//重新将数组分为两段,通过递归调用将两部分进行进一步的排序 
	//左半部分 
	quickSort(array, left, Index - 1);
	//右半部分 
	quickSort(array, Index + 1, right);
	
}

int partsort(int* array, int left, int right)
{
	//找到基准值 
	int point = array[left];
	//记录此时基准值的位置 
	int temp = left;
	//通过两个while相互对 左值与右值的覆盖,从而实现 把数组从基准值分为 两部分 
	while (left < right) {       
		while (left < right) {
			/*如果最右边元素的值 小于 此时的基准值,那么就将此时右边元素的值 复制 给开始的基准位置
			  而此时就会出现两次右边元素的值,需要消掉 本体 的元素,而用其他元素替代*/ 
			if (array[right] < point) {
				array[left] = array[right];
				left++;			//此时左边元素的值被 赋值为 比基准值小的元素值, 满足了小于基准值的条件,就寻找下一个 
				temp = right;
				break;			//一左一右的找 
			} else {
				right--;    	//直到找到比基准值小的右半部分元素 
			}
		}
		while (left < right) {
			/*如果左边的值 大于 基准值,就得把他往后移,移到上上面找到的 右边元素小于基准值的位置,
			将这个本体覆盖为此时的 大于基准值的元素,而此时就是把左值 复制了一边,要把他的本体消掉*/ 
			if (array[left] > point) {
				array[right] = array[left];
				right--;
				temp = left;
				break;
			} else {
				left++;			//直到找到比基准值大的左半部分元素  
			}
		}
	}
	//最后退出循环的条件为left > right,那么这个left后者right就是最后被 复制  的元素; 
	array[temp] = point;		//最后将 最后一个复制的元素 赋值为 一开始的point。 
	return temp;				//返回此次的中点位置 
}


发布了32 篇原创文章 · 获赞 0 · 访问量 475

猜你喜欢

转载自blog.csdn.net/geshifansheng_7/article/details/105355158