【算法课OJ练习题】顺序输出奇数(quick_sort)

题目

计算机设计与算法分析课程
第二次作业(Divide & Conquer)C题

要求很简单,题目设置的就是要快速排序才能通过,只不过读入时只存储奇数
【算法课OJ练习题】顺序输出奇数(quick_sort)_第1张图片
重点就是理解一下快排的方式,模版有很多种。

  • y总的模版是假设 i i i j j j 开始阶段都在数组的两侧,一开始不管三七二十一,直接往里走一步,然后再判断。
  • 其次,为了避免每次判断都考虑等号的情况,直接把等号都去掉,也就是说 i i i j j j 在遇到pivot相等的情况下也会停止脚步,进行交换。

因此,需要明确的一点是:

  • 以这个模版来说,partition下来,左右两个区域都可能存在等于pivot的数。
  • 因为每时每刻 i i i 的左边都是小于等于pivot的数,因此 j j j 走过来的时候一定会停在 i i i 的最左侧,也就是最后的时候 j = i − 1 j = i-1 j=i1

举个例子:(有时间再补充过程hh)
【算法课OJ练习题】顺序输出奇数(quick_sort)_第2张图片

具体代码如下:

#include 
using namespace std;

const int N = 550;
int q[N];
int n;

//这样的快排模版,就不用考虑等号的事情了,因为都没有等号
void quick_sort(int l, int r){
	if(l>=r)return ;
	//因为每次都不管三七二十一,先往里走一格,因此起点设到两端的外侧
	int pivot = q[l + r >> 1], i = l-1, j = r+1;
	while(i<j){
		do i++;while(q[i]<pivot);
		do j--;while(q[j]>pivot);
		if(i<j)swap(q[i],q[j]);  //一定要判断i
	}
	quick_sort(l, j); //因为每时每刻i左边都小于等于pivot,j右侧都大于等于pivot
	quick_sort(j+1, r);//换成是i-1和i也可以
}

int main() {
	scanf("%d", &n);
	int cnt=0, tmp;
	for(int i=0;i<n;i++){
		scanf("%d", &tmp);
		if(tmp%2!=0) q[cnt++] = tmp;
	}
	quick_sort(0, cnt-1);
	
	for(int i=0;i<cnt;i++){
		if(i!=0)printf(",");
		printf("%d",q[i]);
	}
	return 0;
}

你可能感兴趣的:(Algorithm,算法,c++,数据结构)