快速排序算法的C++实现

来源:互联网 发布:通话变声软件 编辑:程序博客网 时间:2024/06/05 16:33

#include<iostream>

using namespace std;

void quicksort(int * arr, int num1,int num2);//对数组arr[num1--num2]排序

void Swap(int &, int &);
int main()
{
int m[] = { 36, 15, 257,13,254,
110,17,26, 3, 14,
29, 60, 18, 33, 69,
125, 44, 16 };
quicksort(m, 0, sizeof(m) / sizeof(int)-1);//sizeof求数组元素多少
for (int i = 0; i < sizeof(m) / sizeof(int); ++i)
cout << m[i] << "\t";
cout << endl;
return 0;
}
void quicksort(int * arr, int num1, int num2)
{
if (num1 >= num2)return;
int i = num1, j = num2;
int key = arr[num1];
while (i<j)
{
while (arr[j]>key)--j;
Swap(arr[i], arr[j]);
while (arr[i] < key)++i;
Swap(arr[i], arr[j]);
}
quicksort(arr, num1, i - 1);
quicksort(arr, i + 1, num2);
}
void Swap(int& m, int &n)
{
int temp = m;
m = n;
n = temp;
}
当输入元素没有相同元素是,输出正确:

但是当输入有相同元素时,输出就会有问题!该怎么解决呢?
或者更通用一点的代码是什么样的呢?
下次再编辑!




调整后的快速排序程序为(可以对有多个相同的数的数组进行排序):
#include<iostream>
using namespace std;
void quicksort(int * arr, int num1,int num2);//对数组arr[num1--num2]排序
void Swap(int &, int &);
void print(int * a, int n, int m);
int main()
{
int m[] = { 36, 15, 13,254,110,17,
26, 33, 14, 150,49,66,
54,98 };
quicksort(m, 0, sizeof(m) / sizeof(int)-1);
for (int i = 0; i < sizeof(m) / sizeof(int); ++i)
cout << m[i] << "\t";
cout << endl;
return 0;
}
void quicksort(int * arr, int num1, int num2)
{
if (num1 == num2||num1 > num2) return ;
int i = num1, j = num2;
int key = arr[num1];
while (i<j)
{
while (j>i&&arr[j]>key)--j;
if (arr[j] == key);//如果等于key,不做操作,等待arr[i]与之互换
else
Swap(arr[i], arr[j]);//小于key互换
print(arr, num1, num2);
while (i<j&&arr[i] <= key)++i;//找到一个大于key的值与arr[j]互换
Swap(arr[i], arr[j]);
print(arr, num1, num2);
}
quicksort(arr, num1, i - 1);
quicksort(arr, i + 1, num2);
}
void Swap(int& m, int &n)
{
int temp = m;
m = n;
n = temp;
}
void print(int * a, int n, int m)
{
for (int i = n; i <= m; i++)
cout << a[i] << "\t";
cout << endl;
}




随机快速排序

#include<iostream>
#include<ctime>
#include<cstdio>
using namespace std;
void quicksort(int * arr, int num1,int num2);//对数组arr[num1--num2]排序
void Swap(int &, int &);
void print(int * a, int n, int m);
int main()
{
int m[] = { 36, 15, 13,254,110,17,
26, 33, 14, 150,49,66,
54,98 };
quicksort(m, 0, sizeof(m) / sizeof(int)-1);
for (int i = 0; i < sizeof(m) / sizeof(int); ++i)
cout << m[i] << "\t";
cout << endl;
return 0;
}
void quicksort(int * arr, int num1, int num2)
{
if (num1 == num2||num1 > num2) return ;
int i = num1, j = num2;
srand(time(0));
int k = (rand()%((num2-num1)+1))+num1;//k的取值范围为num1到num2
int key = arr[k];//随机取值作为比较的对象,也称为随机快速排序
while (i<j)
{
while (j>i&&arr[j]>key)--j;
if (arr[j] == key);//如果等于key,不做操作,等待arr[i]与之互换
else
Swap(arr[i], arr[j]);//小于key互换
print(arr, num1, num2);
while (i<j&&arr[i] <= key)++i;//找到一个大于key的值与arr[j]互换
Swap(arr[i], arr[j]);
print(arr, num1, num2);
}
quicksort(arr, num1, i - 1);
quicksort(arr, i + 1, num2);
}
void Swap(int& m, int &n)
{
int temp = m;
m = n;
n = temp;
}
void print(int * a, int n, int m)
{
for (int i = n; i <= m; i++)
cout << a[i] << "\t";
cout << endl;
}




算法导论中的快速排序算法的实现:
#include<iostream>
#include<ctime>
#include<cstdio>
using namespace std;

void quicksort(int * arr, int num1,int num2);//对数组arr[num1--num2]排序
void quicksort_al(int * arr, int num1, int num2); 
void Swap(int &, int &);
void print(int * a, int n, int m);
int main()
{
int m[] = { 36, 15, 13,254,110,17,
26, 33, 14, 150,49,66,
54,98,66,59,47,17 };
cout << "The original of array:\n";
for (int i = 0; i < sizeof(m) / sizeof(int); ++i)
cout << m[i] << "\t";
cout << "\nThe algorithms of introduct quicksort:\n";
quicksort_al(m, 0, sizeof(m) / sizeof(int)-1);
for (int i = 0; i < sizeof(m) / sizeof(int); ++i)
cout << m[i] << "\t";
cout << endl;
return 0;
}
void quicksort(int * arr, int num1, int num2)
{
if (num1 == num2||num1 > num2) return ;
int i = num1, j = num2;
srand(time(0));
int k = (rand()%((num2-num1)+1))+num1;//k的取值范围为num1到num2
int key = arr[k];//随机取值作为比较的对象,也称为随机快速排序
while (i<j)
{
while (j>i&&arr[j]>key)--j;
if (arr[j] == key);//如果等于key,不做操作,等待arr[i]与之互换
else
Swap(arr[i], arr[j]);//小于key互换
print(arr, num1, num2);
while (i<j&&arr[i] <= key)++i;//找到一个大于key的值与arr[j]互换
Swap(arr[i], arr[j]);
print(arr, num1, num2);

}
quicksort(arr, num1, i - 1);
quicksort(arr, i + 1, num2);
}



void quicksort_al(int * arr, int num1, int num2)//算法导论里快速排序算法
{
if (num1 == num2||num1>num2)return;
int key = arr[num2];
int i = num1-1;
int j = num1;

for (; j <= num2 - 1; ++j)
{
if (arr[j] <= key)
{
Swap(arr[++i], arr[j]);
}
}
Swap(arr[++i], arr[num2]);
quicksort_al(arr,num1, i-1);
quicksort_al(arr, i+1,  num2);
}
void Swap(int& m, int &n)
{
int temp = m;
m = n;
n = temp;
}

void print(int * a, int n, int m)
{
for (int i = n; i <= m; i++)
cout << a[i] << "\t";
cout << endl;
}




0 0
原创粉丝点击