快速排序法!!

#include<iostream>
using namespace std;

int AdjustArray(int s[], int L, int R)
{
    int i=L, j=R, x=s[i]; 
	while(i<j) //i一直都在左边,一直都是小于j的。直到最终i==j 位置 跳出循环。
	{
		// from right to left
		while(i<j && s[j]>=x)
		{
			j--; //从右往左,当s[j]>x时,那么那个位置就不用管,往右减一个位置,直到s[j]<x。
		}
		if (i<j && s[j]<x) 
		{
			s[i]=s[j]; //随后将右边s[j]给填到左边第一个s[i]中,继续往右边走。 i++
			i++; 
		}
		// from left to right
		while(i<j && s[i]<x)  
		{
			i++; //从左往右,如果s[i]<x 就往右走。 直到s[i]>x
		}

		if(i<j && s[i]>x)
		{
				s[j]=s[i];
				j--;//当s[i]>x时,就把s[i]这个数填入到前面s[j]出坑的那个位置。 然后出坑的时候的位置继续往左走。
		}
	}

	s[i]=x; //循环跳出来 最终s[i]==x 就是i位于了 数组的中间位置。

	return i; //返回这个中间位置。
}

//这点有点难理解 因为是连续函数本身自己调用,而且下面调用了两次。结束表示就是i 在不断变化,最后和L和R已经相等,没有无法进行排序。 这是我的想法,因为同时左右空间都在循环,解析来左右空间下面的子空间(左右)也在循环,很复杂所以,只能这样子想 明天看看继续缩减到一个函数内。!
void quicksort1(int s[], int L, int R)
{
	if (L<R)
	{
		int i=AdjustArray(s,L,R);
		quicksort1(s,L,i-1);
		quicksort1(s,i+1,R);
	}
}

int main()
{
	int s[]={1,2,3,4,5,6,89,454,5,1, 4, 3, 4, 6, 1, 35,  8, 4};
	int L =0, R=17;
	quicksort1(s, L, R);
	for (int i =0; i<18; i++)
	{
		cout<<s[i]<<endl;
	}
	return 0;
}


这样看着比较麻烦 把这个函数放在一个函数里面:

#include<iostream>
using namespace std;

void quicksort1(int s[], int L, int R)
{
	int i=L, j=R, x=s[i]; 
	while(i<j)
	{
		// from right to left
		while(i<j && s[j]>=x)
		{
			j--;
		}
		if (i<j && s[j]<x)
		{
			s[i]=s[j];
			i++; 
		}
		// from left to right
		while(i<j && s[i]<x)
		{
			i++;
		}

		if(i<j && s[i]>x)
		{
				s[j]=s[i];
				j--;
		}
	}
	s[i]=x;
	if (L<R)
	{
		quicksort1(s,L,i-1); //递归在左半部分排序。
		quicksort1(s,i+1,R); //递归在右半部分排序。 最终断开的条件是左半部分已经L==R饱和排完序了,右半部分也饱和排完序。 
	}
}


int main()
{
	int s[]={1,2,3,4,5,6,89,454,5,1, 4, 3, 4, 6, 1, 35,  8, 4};
	int L =0, R=17;
	quicksort1(s, L, R);
	for (int i =0; i<18; i++)
	{
		cout<<s[i]<<endl;
	}
	return 0;
}

快速排序怎么画 书上有 我已经花了好多次了:

快速排序其实是冒泡排序的一个高级算法。

快速排序的时间复杂度是O(nlogn) 最坏的情况就是冒泡排序O(n^2)

快速排序的空间复杂度是(log2N);


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值