文章

6

粉丝

696

获赞

1

访问

52.8k

头像
快速排序算法!
P1716 西北工业大学机试题
发布于2021年1月4日 12:56
阅读数 9.0k

#include<bits/stdc++.h>
using namespace std;
const int N=1e6 +10;
int n;
int q[N];
void quick_sort(int q[],int l,int r){
	if(l>=r){
		return ;
	}
	int x = q[(l+r)/2],i = l-1,j=r+1;
	while(i<j){
		do i++; while(q[i]<x);
		do j--; while(q[j]>x);
		if(i<j) swap(q[i],q[j]);
	}
	quick_sort(q,l,j);
	quick_sort(q,j+1,r);
}
int main(){
	scanf("%d",&n);
	for(int i =0;i<n;i++){
		scanf("%d",&q[i]);
	}
	quick_sort(q,0,n-1);
	for(int i = 0;i<n;i++){
		printf("%d ",q[i]);
	}
	return 0;
}

日常学习过程中的快速排序核心思想:

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;

    int x = q[l], j = l;
    for (int i = l + 1; i <= r; i ++ ) 
        if (q[i] < x) swap(q[ ++ j], q[i]);

    swap(q[l], q[j]);
    quick_sort(q, l, j - 1);
    quick_sort(q, j + 1, r);
}

但是如上算法,在数组中只有两个元素的情况下会发生超时,一直死递归,因此需要改善!如下,将边界定为中间元素,将数组分为两半:

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;

    int...
登录查看完整内容


登录后发布评论

1 条评论
admin SVIP
2021年1月5日 22:48

赞一个yes

赞(0)