快速排序是一种基于比较和交换的排序方法,在学习之前我们先来重温一下快速排序吧。
改进的冒泡排序Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
int num[maxn];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
bool flag = false;
for(int i = 1; i < n; i++)
{
for(int j = 1; j <= n-i; j++)
{
if(num[j] > num[j+1])
{
flag = true; //改进的地方,如果有一趟排序发现
//什么都没变,说明现在已经是有序的了,直接退出就可以
swap(num[j], num[j+1]);
}
}
if(flag == false)
break;
}
for(int i = 1; i <= n; i++)
cout << num[i] << " ";
return 0;
}
那么快速排序比冒泡排序厉害在哪里呢???
先来了解一下快速排序的算法实现原理吧:
基本思想:通过一趟排序将待排记录分成两个部分,其中一部分记录的关键字均比另一部分小,然后分别对这两部分继续进行排序,直至达到整个序列有序。
算法实现流程:待排序的序列为{num[low] , num[low+1] , num[low+2] , ... , num[high] }
1. 首先先任取一个关键字(通常取num[low])作为枢轴,然后对整个序列进行整理,让比枢轴关键字小的记录都在枢轴的前面,比枢轴大的都在枢轴的后面,其实现在枢轴位置上放置的关键字,就是正确序列该位置的关键字。
2. 分别对枢轴两边的关键字进行递归整理,如此,就能实现对整个序列的排序。
算法实现:
核心部分就是:找到了枢轴,怎么对序列进行整理,让枢轴线面的都比它小,后面的都比它大。来一起看看吧
快速排序Code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000000;
int num[maxn];
int Partition(int low, int high)
{
num[0] = num[low]; //先把最左边的这个元素搬到凳子上
while(low != high) //开始循环
{
for(high; high > low; high--)
if(num[high] < num[0]){
num[low] = num[high];
break;
}
for(low; low < high; low++)
if(num[low] > num[0]){
num[high] = num[low];
break;
}
}
num[low] = num[0];
return low;
}
void Q_Sort(int low, int high)
{
if(low < high)
{
int mid = Partition(low, high);
Q_Sort(low, mid-1);
Q_Sort(mid+1, high);
}
else
return ;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
Q_Sort(1, n);
for(int i = 1; i <= n; i++)
if(i == 1) cout << num[i];
else cout << " " << num[i];
return 0;
}