您的位置:首页 > 编程语言 > C语言/C++

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

2015-04-07 23:06 246 查看

#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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: