快速排序算法所有版本的c/c++实现
2012-07-04 10:04
417 查看
一、算法导论上的版本
在我写的第二篇文章中,我们已经知道:
“再到后来,N.Lomuto又提出了一种新的版本,此版本....,即优化了PARTITION程序,它现在写在了 算法导论 一书上”:
快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排:
PARTITION(A, p, r)
1 x ← A[r] //以最后一个元素,A[r]为主元
2 i ← p - 1
3 for j ← p to r - 1 //注,j从p指向的是r-1,不是r。
4 do if A[j] ≤ x
5 then i ← i + 1
6 exchange A[i] <-> A[j]
7 exchange A[i + 1] <-> A[r] //最后,交换主元
8 return i + 1
然后,对整个数组进行递归排序:
QUICKSORT(A, p, r)
1 if p < r
2 then q ← PARTITION(A, p, r) //关键
3 QUICKSORT(A, p, q - 1)
4 QUICKSORT(A, q + 1, r)
根据上述伪代码,我们不难写出以下的c/c++程序:
首先是,PARTITION过程:
int partition(int data[],int lo,int hi)
{
int key=data[hi]; //以最后一个元素,data[hi]为主元
int i=lo-1;
for(int j=lo;j<hi;j++) ///注,j从p指向的是r-1,不是r。
{
if(data[j]<=key)
{
i=i+1;
swap(&data[i],&data[j]);
}
}
swap(&data[i+1],&data[hi]); //不能改为swap(&data[i+1],&key)
return i+1;
}
补充说明:举个例子,如下为第一趟排序(更多详尽的分析请参考第二篇文章):
第一趟(4步):
a:3 8 7 1 2 5 6 4 //以最后一个元素,data[hi]为主元
b:3 1 7 8 2 5 6 4
c:3 1 2 8 7 5 6 4
d:3 1 2 4 7 5 6 8 //最后,swap(&data[i+1],&data[hi])
而其中swap函数的编写,是足够简单的:
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
然后是,调用partition,对整个数组进行递归排序:
void QuickSort(int data[], int lo, int hi)
{
if (lo<hi)
{
int k = partition(data, lo, hi);
QuickSort(data, lo, k-1);
QuickSort(data, k+1, hi);
}
}
int main()
{
const int MAX = 10;
int array[MAX] = {1, 2, 6, 2, 9, 0, 2, 4, 5, 3};
quicksort(array, 0, MAX-1);//这里为数组长度减1
for(int i = 0;i<MAX ;i++)
cout<<array[i]<<endl;
return 0;
}
在我写的第二篇文章中,我们已经知道:
“再到后来,N.Lomuto又提出了一种新的版本,此版本....,即优化了PARTITION程序,它现在写在了 算法导论 一书上”:
快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排:
PARTITION(A, p, r)
1 x ← A[r] //以最后一个元素,A[r]为主元
2 i ← p - 1
3 for j ← p to r - 1 //注,j从p指向的是r-1,不是r。
4 do if A[j] ≤ x
5 then i ← i + 1
6 exchange A[i] <-> A[j]
7 exchange A[i + 1] <-> A[r] //最后,交换主元
8 return i + 1
然后,对整个数组进行递归排序:
QUICKSORT(A, p, r)
1 if p < r
2 then q ← PARTITION(A, p, r) //关键
3 QUICKSORT(A, p, q - 1)
4 QUICKSORT(A, q + 1, r)
根据上述伪代码,我们不难写出以下的c/c++程序:
首先是,PARTITION过程:
int partition(int data[],int lo,int hi)
{
int key=data[hi]; //以最后一个元素,data[hi]为主元
int i=lo-1;
for(int j=lo;j<hi;j++) ///注,j从p指向的是r-1,不是r。
{
if(data[j]<=key)
{
i=i+1;
swap(&data[i],&data[j]);
}
}
swap(&data[i+1],&data[hi]); //不能改为swap(&data[i+1],&key)
return i+1;
}
补充说明:举个例子,如下为第一趟排序(更多详尽的分析请参考第二篇文章):
第一趟(4步):
a:3 8 7 1 2 5 6 4 //以最后一个元素,data[hi]为主元
b:3 1 7 8 2 5 6 4
c:3 1 2 8 7 5 6 4
d:3 1 2 4 7 5 6 8 //最后,swap(&data[i+1],&data[hi])
而其中swap函数的编写,是足够简单的:
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
然后是,调用partition,对整个数组进行递归排序:
void QuickSort(int data[], int lo, int hi)
{
if (lo<hi)
{
int k = partition(data, lo, hi);
QuickSort(data, lo, k-1);
QuickSort(data, k+1, hi);
}
}
int main()
{
const int MAX = 10;
int array[MAX] = {1, 2, 6, 2, 9, 0, 2, 4, 5, 3};
quicksort(array, 0, MAX-1);//这里为数组长度减1
for(int i = 0;i<MAX ;i++)
cout<<array[i]<<endl;
return 0;
}
相关文章推荐
- 十二之再续:快速排序算法之所有版本的c/c++实现
- 快速排序算法之所有版本的c/c++实现
- <续>快速排序算法所有版本的c/c++实现
- 快速排序算法之所有版本的c/c++实现
- 十二之再续:快速排序算法之所有版本的c/c++实现
- 十二、一之再续:快速排序算法之所有版本的c/c++实现
- 十二之再续:快速排序算法之所有版本的c/c++实现
- 十二、一之再续:快速排序算法之所有版本的c/c++实现
- 十二之再续:快速排序算法之所有版本的c/c++实现
- 十二之再续:快速排序算法之所有版本的c/c++实现
- 快速排序算法之所有版本的c/c++实现
- 快速排序算法所有版本的c/c++实现
- 快速排序算法所有版本的c/c++实现
- 归并排序的简单实现(c++ 版本)
- 指定结构体排序字段的STL实现版本(C++ 2011系列)
- C++ 版本的 行为树的简单实现
- 快速排序算法C++实现
- C++实现目录下所有文件添加后缀名
- 分析模式-计量的C++实现——完美版本
- 图的深度优先搜索 递归和非递归实现 c++版本