Quicksort:
找到第一个元素在数组中的正确位置,每次找到正确位置后。将原始数组分为了两个部分,将被分割的两数组重复以上操作,直至排序完成。
其实还是在看了相关的代码,借鉴了别人的想法后写出来的,自认为这道题中比较困难的部分是如何找到一个元素在数组中的正确位置,采用先从右开始,找到一个比所需排序数更小的数,与其交换位置,在从左找比它更大的数,交换位置,一次循环后,便可缩小范围,进行循环,直到左右边界重合,此时便找到了其正确的位置。
#include<iostream>
#include<cstdlib>
using namespace std;
const SIZE = 10;
//将所给定的数组的第一个元素排到其正确的位置处
//例如数组: 5,2,1,43,8,99,4,3,6,9
int sortPartition(int * a,int begin,int end)
{ int first=a[begin];//Take the first element of the array
int i=begin;
int j=end;
while(i!=j)
{ //从右开始比较,找到第一个比first更小的数,其位置为j
//3比5小,此时j=7
while(first<=a[j]&&i<j)
j--;
//从左开始比较,找到第一个比first更大的数,其位置为i
//43比5大,此时i=3
while(first>=a[i]&&i<j)
i++;
//进行数值调整
//调整后数组为: *3*,2,1,**5**,8,99,4,*43*,6,9
a[begin]=a[j];
a[j]=a[i];
a[i]=first;
//改变左右边界,再次循环
//之后数组则变为了5,8,99,4,43,进行下一次循环
begin=i;
end=j;
}
return i;
}
void Quicksort(int * a,int begin,int end)
{ int p;
if(begin<end)//只有一个元素,结束递归
{ //找到数组第一个数的正确位置
p=sortPartition(a,begin,end);
//将数组分为两个部分再次进行排序
Quicksort(a,begin,p-1);
Quicksort(a,p+1,end);
}
}
int main()
{ int a[SIZE]={0};
cout<<"Input "<<SIZE<<" integers: ";
for(int i=0;i<SIZE;i++)
cin>>a[i];
Quicksort(a,0,SIZE-1);
cout<<"After sort: ";
for(int j=0;j<SIZE;j++)
cout<<a[j]<<" ";
cout<<endl;
system("pause");
return 0;
}