见过的最精炼的快速排序

在屈婉玲的《算法设计与分析中》看到快速排序的代码,感觉挺精炼的。特此记录以下。

//交换两个数

void swap(int *a, int *b) {

int tmp=*a;

*a=*b;

*b=tmp;

}

//找出arr[p]应该在的位置

int Partition(int arr[], int p, int r) {

int x=arr[p], j=r+1, i=p; //注意j的初始值为r+1,而i的初始值为p

while(true) {

do {

j--;

}while(arr[j]>x); //while里面的条件非常巧妙,确保至少会在p处停下来,所以没有写j>=p

do {

i++;

}while(i<=r&&arr[i]<=x); //因为担心i越界,所以在这里加了限制条件i<=r

if(i<j) {

swap(&arr[i], &arr[j]);

} else {

return j;

}

}

}

void Quicksort(int arr[], int p, int r) {

if(p<r) {

int q=Partition(arr, p, r);

swap(&arr[p], &arr[q]);

Quicksort(arr, p, q-1);

Quicksort(arr, q+1, r);

}

}

int main() {

int a[10]={10,9,8,7,6,5,4,3,2,1};

Quicksort(a, 0, 9);

for(int *p=a; p<a+10; p++) {

cout << *p << endl;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值