本文介绍: 一、引言快速排序的思想——分治一、引言快速排序是对冒泡排序的一种改进。它的基本思想在于划分,首先选一个基准x,让x的左边都小于x,让x的右边都大于x。然后通过递归,一直将数组分成两个或一个元素。二、讲解1、步骤1、将确定分界点。2、调整范围——让基准x的左边都小于x,让x的右边都大于x。3、递归分治。如果arr数组为:【0,1】基准点为左边界。因为i先自增,arr[0]==0,退出循环.。j先自减,arr[j]>0,继续进入循环,j–,arr[j]==0,退出循环。
快速排序的思想——分治
一、引言
快速排序是对冒泡排序的一种改进。它的基本思想在于划分,首先选一个基准x,让x的左边都小于x,让x的右边都大于x。然后通过递归,一直将数组分成两个或一个元素。
二、讲解
1、步骤
1、将确定分界点。
2、调整范围——让基准x的左边都小于x,让x的右边都大于x。
3、递归分治。
x=0,i=-1,j=2;
j先自减,arr[j]>0,继续进入循环,j–,arr[j]==0,退出循环。
如果:
这样分治的话:第一个递归进入后会立刻退出来,因为分治的区间没有元素。第二个递归进入后,要进行划分的区间仍然是【0,1】,将会死循环,栈溢出。
所以分边界点的话要用j进行区分。
2、代码
1.以左边界作为基准
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
if (l >= r) {
return;
}
//基准x是arr数组的左边界
int i = l - 1, j = r + 1, x = arr[l];
while (i < j) {
do {
i++;
} while (arr[i] < x);
do {
j--;
} while (arr[j] > x);
if (i < j) {
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//这块要配合着基准x为arr的左边界,下边的j不能换成i
//如果要换成i的话,基准x也要跟着变
quick_sort(arr, l, j);
quick_sort(arr, j + 1, r);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
2.以右边界作为基准
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
if (l >= r) {
return;
}
int i = l - 1, j = r + 1, x = arr[r];
while (i < j) {
do {
i++;
} while (arr[i] < x);
do {
j--;
} while (arr[j] > x);
if (i < j) {
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
quick_sort(arr, l, i-1);
quick_sort(arr, i, r);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
3.以中心点作为基准
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
if (l >= r) {
return;
}
int i = l - 1, j = r + 1, x = arr[(l+r)/2];
while (i < j) {
do {
i++;
} while (arr[i] < x);
do {
j--;
} while (arr[j] > x);
if (i < j) {
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
quick_sort(arr, l, j);
quick_sort(arr, j+1, r);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
原文地址:https://blog.csdn.net/qq_73435980/article/details/134745888
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_36904.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。