快速排序算法

来源:互联网 发布:mac yum install 编辑:程序博客网 时间:2024/04/27 20:46

     快速排序算法是对冒泡排序算法的改进。它的基本思想是,通过一趟排序将序列分成两部分,其中一部分记录均比另一部分记录的值小。再分别对这两部分序列继续快速排序,以达到整个序列的有序。

     在具体实现方法上是对序列data[s..t],以data[s]作为枢纽重新排列,把比data[s]大的都放到它前面,比data[s]小的都放到它后面,经过重新排列后s的位置也产生了变化,假设变为i(s<i<t)。之后再对data[s..i-1]和data[i+1..t]分别进行快速排序,直到整个序列有序。

下面看一下示范代码:

//-------------快速排序------------------------------------------
template<typename T>
void qkpass(T *data, int s,int t, int &i)
{//一趟快速排序,将data[s..t]以data[s]为枢纽重新排列分成两部分
//一部分小于data[s],一部分大于data[s],s被移动到i的位置。
= s;
T x 
= data[s];    //暂存data[s]
int j=t;
while( i < j )
{
   
//从t倒退查找小于x的元素,找到后移动到序列的前面
   while( i < j && data[j] >= x ) j--;
   data[i] 
= data[j];

   
//从s开始向前找大于x的元素,找到后移动到序列的后面
   while( i < j && data[i] <= x ) i++;
   data[j] 
= data[i];
}

data[i] 
= x;
}


template
<typename T>
void qksorti(T *data, int s,int t)
{//快速排序递归过程,对data[s..t]进行快速排列
if( s < t )
{
   
int k = 0;

   
//一趟排序,以位置k分成两部分,前面的全部小于data[k],后面的全部大于data[k]
   qkpass( data, s, t, k );

   
//对k前面的元素再进行快速排序
   qksorti( data, s, k-1 );

   
//对k后面的元素再进行快速排序
   qksorti( data, k+1, t );
}

}


template
<typename T>
void qksort(T *data, unsigned len)
{//快速排序
qksorti( data, 0, len-1 );
}

//--------------end of快速排序--------------------------------


int _tmain(int argc, _TCHAR* argv[])
{

int arr[] = {100,5,1,3,11,3,6,-1};

qksort( arr, 
sizeof(arr)/sizeof(arr[0]) );

return 0;
}
 
原创粉丝点击