基础算法--排序:之快速排序
2014-05-04 16:00
274 查看
与简单排序不同,快序排序所需的比较次数较少,是内部排序中速度较快的一种排序方法。
算法思想: 分-------------- 将待排序集合划分为2部分 (一部分小于准则值,一部分大于等于准则值)
这个分的过程是不断迭代的,直到无法再分为止。
算法过程演示:
一趟排序所使用的算法:
示例:
示例:
算法:
算法分析:
程序代码:
形式1:
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
}
形式1---优化1:(如何确定基准值)
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
int & iLeft=R[low];
int & iRight=R[high];
int & iMiddle=R[(low+high)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
}
形式1----优化2 (元素个数小于30时,采用选择排序)
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
int & iLeft=R[low];
int & iRight=R[high];
int & iMiddle=R[(low+high)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
/*
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
*/
if(i-low>30)
QuickSort(R,low,i-1);
else
StraightSelectionSort(R,i-low);
if (high-i>30)
QuickSort(R,i+1,high);
else
StraightSelectionSort(&R[i+1],high-i);
}
形式2:
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
i=0;
j=n-1;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
}
形式2---优化1
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
int & iLeft=R[0];
int & iRight=R[n-1];
int & iMiddle=R[(n-1)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=0;
j=n-1;
pivot=R[i]; // 此时R[0]为 上述三值得中间值
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
}
形式2-----优化2
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
int & iLeft=R[0];
int & iRight=R[n-1];
int & iMiddle=R[(n-1)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=0;
j=n-1;
pivot=R[i]; // 此时R[0]为 上述三值得中间值
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
/*
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
*/
if(i>30)
QuickSort(R,i);
else
StraightSelectionSort(R,i);
if (n-i-1>30)
QuickSort(R,n-i-1);
else
StraightSelectionSort(&R[i+1],n-i-1);
}
[cpp] view
plaincopy
void StraightSelectionSort(int *p, int n)
{
int i,j,t;
int indexMax;
for (i=0;i<n;i++) // 0....n-1
{
// 未排元素 0...n-1-i 以排元素 n-i...n-1
for (j=0,indexMax=0;j<n-i;j++)
{
if (p[j]>=p[indexMax])
{
indexMax=j;
}
}
t=p[n-i-1];
p[n-i-1]=p[indexMax];
p[indexMax]=t;
}
}
算法思想: 分-------------- 将待排序集合划分为2部分 (一部分小于准则值,一部分大于等于准则值)
这个分的过程是不断迭代的,直到无法再分为止。
算法过程演示:
一趟排序所使用的算法:
示例:
示例:
算法:
算法分析:
程序代码:
形式1:
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
}
形式1---优化1:(如何确定基准值)
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
int & iLeft=R[low];
int & iRight=R[high];
int & iMiddle=R[(low+high)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
}
形式1----优化2 (元素个数小于30时,采用选择排序)
[cpp] view
plaincopy
void QuickSort(int R[], int low,int high)
{
int i,j;
int pivot;
int & iLeft=R[low];
int & iRight=R[high];
int & iMiddle=R[(low+high)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=low;
j=high;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
/*
if(low<i-1) QuickSort(R,low,i-1);
if(high>i+1) QuickSort(R,i+1,high);
*/
if(i-low>30)
QuickSort(R,low,i-1);
else
StraightSelectionSort(R,i-low);
if (high-i>30)
QuickSort(R,i+1,high);
else
StraightSelectionSort(&R[i+1],high-i);
}
形式2:
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
i=0;
j=n-1;
pivot=R[i];
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
}
形式2---优化1
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
int & iLeft=R[0];
int & iRight=R[n-1];
int & iMiddle=R[(n-1)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=0;
j=n-1;
pivot=R[i]; // 此时R[0]为 上述三值得中间值
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
}
形式2-----优化2
[cpp] view
plaincopy
void QuickSort(int R[], int n)
{
int i,j;
int pivot;
int & iLeft=R[0];
int & iRight=R[n-1];
int & iMiddle=R[(n-1)/2];
// 目的为了使 准则值R[low] 为这三个值的中间值
int temp;
if (iLeft>iMiddle)
{
temp=iMiddle;
iMiddle=iLeft;
iLeft=temp;
}
if (iRight>iMiddle)
{
temp=iMiddle;
iMiddle=iRight;
iRight=temp;
}
if (iLeft<iRight)
{
temp=iRight;
iRight=iLeft;
iLeft=iRight;
}
i=0;
j=n-1;
pivot=R[i]; // 此时R[0]为 上述三值得中间值
do
{
while((R[j]>=pivot)&&(i<j)) j--;
if(i<j) R[i++]=R[j];
while(R[i]<pivot&&(i<j)) i++;
if(i<j) R[j--]=R[i];
} while (i!=j);
R[i]=pivot;
/*
if(i>1) QuickSort(R,i);
if(n-i-1>1) QuickSort(&R[i+1],n-i-1);
*/
if(i>30)
QuickSort(R,i);
else
StraightSelectionSort(R,i);
if (n-i-1>30)
QuickSort(R,n-i-1);
else
StraightSelectionSort(&R[i+1],n-i-1);
}
[cpp] view
plaincopy
void StraightSelectionSort(int *p, int n)
{
int i,j,t;
int indexMax;
for (i=0;i<n;i++) // 0....n-1
{
// 未排元素 0...n-1-i 以排元素 n-i...n-1
for (j=0,indexMax=0;j<n-i;j++)
{
if (p[j]>=p[indexMax])
{
indexMax=j;
}
}
t=p[n-i-1];
p[n-i-1]=p[indexMax];
p[indexMax]=t;
}
}
相关文章推荐
- 算法基础之排序篇-快速排序
- 【基础算法】排序-复杂排序之二(快速排序)
- 算法基础之排序—快速排序
- PHP四种基础算法详解(冒泡排序、选择排序、插入排序、快速排序)
- 基础算法之排序--快速排序
- 基础排序算法之快速排序(Quick Sort)
- 基础排序算法之快速排序(Quick Sort)
- 算法基础之----直接选择排序
- c语言基础算法(一)---排序
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 基础算法系列(三)——插入排序
- 一步一步复习数据结构和算法基础-快速排序
- 数据结构<一> 排序算法之快速排序
- 基础算法-直接选择排序
- 基础算法(一):选择排序和冒泡排序
- 【基础算法】排序-简单排序之二(选择排序)
- 【基础算法】选择排序与冒泡排序
- 基础算法之快速排序
- 常用算法总结之排序(四)----快速排序
- 【基础算法】排序-简单排序之四(Knuth洗牌算法)