c++与C语言中库函数快速排序的实现
首先先附上完整代码
#include<iostream>
using namespace std;
//快速排序
void sort_t(int a[],int left,int right)
{
if(left>=right)
return;
int i,j;
i=left;
j=right;
int temp=0;
int t=a[left];
while(i!=j)
{
while(a[j]>=t&&i<j)
{
j=j-1;
}
while(a[i]<=t&&i<j)
{
i=i+1;
}
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[left]=a[i];
a[i]=t;
sort_t(a,left,i);
sort_t(a,i+1,right);
}
int main(int argc, char const *argv[])
{
int a[10]={0,2,3,4,1,6,5,7,9,8};
sort_t(a,0,10);
for (int i = 0; i < 10; ++i)
{
cout<<a[i]<<" ";
/* code */
}
cout<<endl;
return 0;
}
快速排序算法的实现思想———分治法
分治法的基本思想就是将一个大问题分解成性质相同的小问题,使用递归的方法解决这问题,最后将这些小问题合并,答案就会出来。
快排算法正是基于这个思想,首先在你的输入数组中取一个值,将这个数组分为左右2个数组,左面是小于这个数的,而右面是大于这个数,通过递归一直递归下去,可想而知数组就会在递归完成时排序成功。
主要的问题就在这个分上面,下面是分的代码
i=left;
j=right;
int temp=0;
int t=a[left];
while(i!=j)
{
while(a[j]>=t&&i<j)
{
j=j-1;
}
while(a[i]<=t&&i<j)
{
i=i+1;
}
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
这部分的代码主要就是实现将自己的输入数组分块。
下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15 共8个元素
初始状态: 46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7
i = 0 j = 7
15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1
i = 1 j = 7
15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2
i = 2 j = 7
15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6
i = 2 j = 6
15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5
i = 2 j = 5
15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3
i = 3 j = 5
15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4
3 = i j = 4
15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3
i = j = 3
i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。