快速排序(Quick Sort)基本思想:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
举例:
以最后一个元素为主元(关键字Key)
返回下标:i + 1 = 4;
将序列分为[23 4 12 7] 和[67 90 56],再分别对两个子序列递归进行快速排序;
代码实现:
#include<iostream>
#include<exception>
using namespace std;
//---------------------------------------------快速排序Soulation1---------------------------------------
int partion_Soulation1(int* data , int start , int end);//取最后元素为主元 //优化版本,思路清晰
int partion_Soulation2(int* data , int start , int end);//取最后元素为主元
int partion_Soulation3(int* data , int satrt , int end);//取第一个元素为主元
int partion_Soulation4(int* data , int start , int end);//三位取中元(最终优化)
void QuickSort_Soulation1(int* data , int start , int end)
{
if(data == NULL || (start >= end) )
throw new std::exception("InvalidInput parameters");
return;
if(start < end)
{
int part = partion_Soulation1(data , start , end);
QuickSort_Soulation1(data , start , part - 1);
QuickSort_Soulation1(data , part + 1 , end);
}
}
int partion_Soulation1(int* data , int start , int end)
{
int key = data[end];
int i = start - 1;
for(int j = start; j < end; j++)
{
if(data[j] <= key)
{
i++;
swap(data[i] , data[j]);
}
}
//swap(data[i + 1] , key); 错误
swap(data[i + 1] , data[end]);
return i + 1;
}
//--------------------------------------------------Soulation2----------------------------------------------------------
void QuickSort_Soulation2(int* data , int start , int end)
{
if(data == NULL || (start >= end) )
throw new std::exception("InvalidInput parameters");
return;
if(start < end)
{
int part = partion_Soulation2(data , start , end);
QuickSort_Soulation2(data , start , part - 1);
QuickSort_Soulation2(data , part + 1 , end);
}
}
int partion_Soulation2(int* data , int start , int end)
{
int key = data[end];
int i = start - 1;
//start <= j <= end
for(int j = start; j <= end; j++)
{
if(data[j] <= key)
{
i++;
swap(data[i] , data[j]);
}
}
//去掉swap(data[i + 1] , data[end])
return i;
}
//---------------------------------------------------Soulation3---------------------------------------------------------
void QuickSort_Soulation3(int* data , int start , int end)
{
if(data == NULL || (start >= end) )
throw new std::exception("InvalidInput parameters");
return;
if(start < end)
{
int part = partion_Soulation3(data , start , end);
QuickSort_Soulation3(data , start , part-1);
QuickSort_Soulation3(data , part + 1 , end);
}
}
int partion_Soulation3(int* data , int start , int end)
{
int key = data[start];
int i = start;
int j = end;
while(i < j)
{
while(key <= data[j] && i < j)
j--;
data[i] = data[j];
while(data[i] <= key && i < j)
i++;
data[j] = data[i];
}
data[i] = key;
return i;
}
//----------------------------------------------------Soulation4--------------------------------------------------
void QuickSort_Soulation4(int* data , int start , int end)
{
if(data == NULL || (start >= end) )
throw new std::exception("InvalidInput parameters");
return;
if(start < end)
{
int part = partion_Soulation3(data , start , end);
QuickSort_Soulation4(data , start , part-1);
QuickSort_Soulation4(data , part + 1 , end);
}
}
int partion_Soulation4(int* data , int start , int end)
{
int key;
int mid = (end + start) / 2;
if(data[start] > data[end])
swap(data[start] , data[end]);
if(data[mid]>data[end])
swap(data[mid] , data[end]);
if(data[mid] > data[start])
swap(data[mid] , data[start]); //将start , mid 中较大者赋值给start
key = data[start]; //中间数赋值给key
int i = start;
int j = end;
while(i < j)
{
while(key <= data[j] && i < j)
j--;
data[i] = data[j];
while(data[i] <= key && i < j)
i++;
data[j] = data[i];
}
data[i] = key;
<pre code_snippet_id="102955" snippet_file_name="blog_20131208_1_7339271" name="code" class="cpp"> /*功能一样
while(i < j)
{
while(key <= data[j] && i < j)
j--;
swap(data[i] , data[j])
while(data[i] <= key && i < j)
i++;
swap(data[i],data[j])
}
*/return i;}
大牛博客: http://blog.csdn.net/v_july_v/article/details/6116297