题目描述:
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。
快速排序的算法可以描述如下:
在本题中,读入一串整数,将其使用以上描述的快速排序的方法从小到大排序,并输出。
输入:
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出:
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入:
10
2 8 4 6 1 10 7 3 5 9
样例输出:
1 2 3 4 5 6 7 8 9 10
解题思路:
基础题,不多说
参考代码:
#include<bits/stdc++.h>
using namespace std;
//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[],int low,int high){
int pivot=A[low];//第一个元素作为枢轴
while(low<high){
while(low<high&&A[high]>=pivot) --high;
A[low]=A[high];//比枢轴小的元素移动到左端
while(low<high&&A[low]<=pivot) ++low;
A[high]=A[low];//比枢轴大的元素移动到右端
}
A[low]=pivot; //枢轴元素存放到最终位置
return low;
}
//快速排序
void QuickSort(int A[],int low,int high){
if(low<high){//递归跳出的条件
int pivotpos=Partition(A,low,high);//划分
QuickSort(A,low,pivotpos-1);//划分左子表
QuickSort(A,pivotpos+1,high);//划分右子表
}
}
int main()
{
int n,A[1001],i,len;
while(cin>>n){
for(i=0;i<n;i++)
cin>>A[i];
QuickSort(A,0,n-1);
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
void QuickSort(int array[], int low, int high) {
int i = low;
int j = high;
if(i >= j) {
return;
}
int temp = array[low];
while(i != j) {
while(array[j] >= temp && i < j) {
j--;
}
while(array[i] <= temp && i < j) {
i++;
}
if(i < j) {
swap(array[i], array[j]);
}
}
//将基准temp放于自己的位置,(第i个位置)
swap(array[low], array[i]);
QuickSort(array, low, i - 1);
QuickSort(array, i + 1, high);
}
int main()
{
int n,A[1001],i,len;
while(cin>>n){
for(i=0;i<n;i++)
cin>>A[i];
QuickSort(A,0,n-1);
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
}
return 0;
}