快速排序的概念和原理大家应该都了解了,这里主要提供代码实现,下面使用了两种方法实现,具体见注释~
#include<iostream>
using namespace std;
void quicksort(int a[], int left, int right)
{
int temp, start=left, endd=right;
temp = a[start];
if(left>right)
return;
while(left!=right) //此时左右index在移动中,若left==right,则跳出循环
{
while(a[right]>=temp && left<right) //直到找到小于基准数的值为准
{
right--;
}
while(a[left]<=temp && left<right) //直到找到大于基准数的值为准
{
left++;
}
if(left<right) //交换左右两侧值
{
swap(a[left], a[right]);
}
}
a[start]=a[left]; // a[start]为temp基准值
a[left]=temp; // 这两步相当于交换最后left==right时的值和基准值,为了让基准值在最中间
// 查看每次排序是否正确
/*for(int i=left; i<=right;i++)
cout<<a[i]<<" ";
cout<<endl;*/
//递归处理归位后的基准数的左右两侧 此时left==right
quicksort(a, start, left-1);
quicksort(a, left+1, endd);
}
void quicksort1(int a[], int left, int right)
{
int temp, start=left, endd=right;
temp = a[start];
if(left>right)
return;
while(left<right)
{
// 从后往前找小于k的第一个值
while(left<right && a[right]>temp)
right--;
if(left<right)
{
a[left]=a[right];
left++;
}
// 从前往后找大于k的第一个值
while(left<right && a[left]<temp)
left++;
if(left<right)
{
a[right]=a[left];
right--;
}
}
a[left]=temp;
// 查看每次排序是否正确
/*for(int i=left; i<=right;i++)
cout<<a[i]<<" ";
cout<<endl;*/
quicksort1(a, start, left-1);
quicksort1(a, left+1, endd);
}
// 以a[i][0] 为排序标准, 记得交换的时候 a[i][1]也要对应交换
void quicksort2(int a[][2], int left, int right)
{
int temp, temp1, start=left, endd=right;
temp = a[start][0];
temp1 = a[start][1];
if(left>right)
return;
while(left!=right) //此时左右index在移动中,若left==right,则跳出循环
{
while(a[right][0]>=temp && left<right) //直到找到小于基准数的值为准
{
right--;
}
while(a[left][0]<=temp && left<right) //直到找到大于基准数的值为准
{
left++;
}
if(left<right) //交换左右两侧值
{
swap(a[left][0], a[right][0]);
swap(a[left][1], a[right][1]);
}
}
a[start][0]=a[left][0]; // a[start]为temp基准值
a[start][1]=a[left][1];
a[left][0]=temp; // 这两步相当于交换最后left==right时的值和基准值,为了让基准值在最中间
a[left][1]=temp1;
//递归处理归位后的基准数的左右两侧 此时left==right
quicksort2(a, start, left-1);
quicksort2(a, left+1, endd);
}
int main()
{
int a[15],n, b[15][2];
while(1)
{
cin>>n;
/*for(int i=0;i<n;i++)
cin>>a[i];
quicksort1(a, 0, n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;*/
for(int i=0;i<n;i++)
for(int j=0;j<2;j++)
cin>>b[i][j];
quicksort2(b, 0, n-1);
for(int i=0;i<n;i++)
{
for(int j=0;j<2;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
return 0;
}