标签:快速排序
在前面博客有写英文版的快速查找实现例子,在复习的时候,有了新的领悟。
【思想】
快速排序算法关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移动到数组左边,比选择的数字大的移动到数组的右边。
【实例说明】
快速排序数组data[] = {2,4,9,3,6,7,1,5},设置第一个数为基准值,将其他元素与其进行比较,数组长度为8,设置两个指针i,j分别指向待排序数组首末下标,待比较情况进行移动:
第一组排序:
以基准值basis = data[0] = 2对数组进行划分调整顺序,让小于2的都在它的左边,大于2的都在它的右边,具体实现思想为,先对data[j]进行操作,当data[j]> basis, j减1,向前移动一个,否则将data[j]的值填补data[i],data[j]就变成下次待填补对象,i此时向后移动一格,并开始对data[i]进行操作,如果data[i]< basis,i加1,向后移动一格,否则就将data[i]的值填补此时的data[j],data[i]此时变成待填补对象,j向前移动,重复前面的步骤,直到i = j时,说明全部比较完了,填补此时data[i]的位置,如此便能得到以基准值划分出来的左边小于basis,右边大于basis的情况。过程如下图所示:
这一组排序以basis = data[i],i = 0,j = 7,排序后得到的数组{1,2,9,3,6,7,4,5}
第二组排序:i = 0 , j = 0, basis = data[i] =1,排序后得到的数组{1,2,9,3,6,7,4,5}
第三组排序:i = 2, j=7, basis = data[i] = 9,排序后得到的数组{1,2,5,3,6,7,4,9}
第四组排序:i=2,j=6,basis = data [2] = 5,排序后得到的数组{1,2,4,3,5,7,6,9}
第五组排序:i = 2,j = 3,,basis = data[2] = 4,排序后得到的数组{1,2,3,4,5,7,6,9}
第五组排序:i = 5,j = 6,basis = data[5] = 7,排序后得到的数组{1,2,3,4,5,6,7,9}
【测试代码】
#include<stdio.h>
void quicksort(int data[],int lo,int hi)
{
if(lo>=hi)
return;
int i=lo , j=hi;
int basis = data[lo];
while(i < j)
{
while((data[j] > basis)&&(i<j))
j-- ;
if(i<j)//这块一定要有这个判断,否则会出错
{
data[i++] = data[j];
}
while((data[i] < basis)&&(i<j))
i++;
if(i<j)
{
data[j--] = data[i];
}
}
data[ i ] = basis;
quicksort(data, lo, i-1 );
quicksort(data, i+1, hi);
}
int main()
{
int i;
int data[] = {2,4,9,3,6,7,1,5};
quicksort(data , 0 , 7);
for(i=0;i<8;i++)
printf("%d ",data[i]);
return 0;
}
【输出】
标签:快速排序
原文地址:http://blog.csdn.net/xinyu913/article/details/46054265