以首元素为基准,先从右边向左边扫描,再从左边向右边扫描。将叫小的数移动到前面,较大的数移动到后面,则第一轮过后,
首元素将所有数据分成了左右两部分,让后对左右两部分继续进行相同的操作。
1、
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void quicksort(int data[], int low, int high)
{
int i, pivot, j;
if(low < high){
pivot = data[low];
i = low;
j = high;
while(i < j){
//cout<<"data[j]: "<<data[j]<<endl;
while(i < j && data[j] >= pivot){
j--;
}
if(i < j){
data[i++] = data[j];
}
while(i < j && data[i] <= pivot){
i++;
}
if(i < j){
data[j--] = data[i]; //每次的赋值都是填充上一次的基准所在位置元素
}
}
data[i] = pivot; //将基准赋给
quicksort(data, low, i - 1);
quicksort(data, i + 1, high);
}
}
int main(void)
{
int i;
int arr[8];
printf("Input six number: \n");
for(i = 0; i < 8; i++){
scanf("%d", &arr[i]);
}
quicksort(arr, 0, 7);
for(i = 0; i < 8; i++){
printf("%d ", arr[i]);
}
}
2、
//注意if(low<high)这一判断语句,否则不知道终止条件
#include<iostream>
using namespace std;
int partion(int data[],int low ,int high){
int i,j,k;
i=low;j=high;k=data[i];
while(i<j){
while((i<j)&&data[j]>=k){
j--;
}
data[i++]=data[j];
while((i<j)&&data[i]<=k){
i++;
}
data[j--]=data[i];
}
data[i]=k;
return i;
}
void qsort(int data[],int low,int high){
int temp;
if(low<high){ //注意这个地方大判断语句特别重要,一定要加
temp=partion(data,low,high);
qsort(data,low,temp-1);
qsort(data,temp+1,high);
}
}
int main()
{
int a[5];
int i;
for(i=0;i<5;i++){
scanf("%d",&a[i]);
}
qsort(a,0,4);
for(i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
}