您的位置:首页 > 其它

冒泡排序与快速排序

2016-04-16 21:08 183 查看
1 冒泡排序与快速排序

冒泡排序与快速排序属于互换类的排序方法。所谓互换排序是指借助数据元素之间的互相交换进行排序的一种方法。

1.1冒泡排序

算法情景:将一个无序的数组进行冒泡排序

冒泡排序方案1:

算法思路:冒泡排序方案1的排序思想就是外层循环n-1;内层循环n-i-1次,内层的每次的循环都是将最大的数字下沉到最后位置,意思就是说把最大的数字放到最后的位置,次大的放到最后位置的前一位,依此类推。

编码:

#include "stdafx.h"
#include <iostream>
#include <iomanip>

using namespace std;

template <class T>
void bub1(T p[], int n){

T temp;
for (int i = 0; i < n; i++)
for (int j = 0; j < n - i - 1;j++)
{
if (p[j] > p[j + 1])
{
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}

}

int _tmain(int argc, _TCHAR* argv[]){

double a[10] = { 5, 8, 12, 78, 96, 41, 20 ,3,255,24};

cout << "排序前:" << endl;
for (int i = 0; i < 10; i++){
cout << setw(5) << a[i];
}

bub1(a, 10);

cout << "排序后:" << endl;
for (int i = 0; i < 10; i++){
cout << setw(5) << a[i];
}

return 0;
}


冒泡排序方案2:

算法思路:首先,从表头开始往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将他们交换,称之为消去一个逆序,最后将线性表中的最大者换到了表的最后。

然后,从后到前扫描剩下的线性表,同样在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,后面的元素小于前面的元素,则将它们互换,这样就又消失了一个逆序,最后将线性表中最小者换到了表的最前面,

对剩下的线性表重复上述过程,知道剩下的线性表变空为止,此时的线性表已经变为有序。

冒泡排序过程示意图如下所示:



编码:

#include "stdafx.h"
#include <iostream>
#include <iomanip>

using namespace std;

template <class T>
void bub2(T p[], int n){
int m, k, j, i;
T temp;
k = 0;
m = n - 1;
while (k < m)
{
j = m - 1;
m = 0;
for (i = k; i <= j;i++)			//从前往后扫描
if (p[i]>p[i + 1])			//顺序不对,交换
{
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
m = i;
}
j = k + 1;
k = 0;
for (i = m; i >= j;i--)			//从后往前扫描
if (p[i-1]>p[i])			//顺序不对,交换
{
temp = p[i];
p[i] = p[i - 1];
p[i - 1] = temp;
k = i;
}
}
return;
}

int _tmain(int argc, _TCHAR* argv[])
{
int i, j;
double p[50], r = 1.0;
for (i = 0; i < 50;i++)			//产生50个0-1之间的随机数
{
r = 2053.0*r + 13849.0;
j = r / 65536.0;
r = r - j*65536.0;
p[i] = r / 65536.0;
}

for (i = 0; i < 50; i++)		//产生50个100-300之间的随机数
p[i] = 100.0 + 200.0*p[i];
cout << "排序前的序列:" << endl;
for (i = 0; i < 10;i++)
{
for (j = 0; j < 5; j++)cout << setw(10) << p[5 * i + j];
cout << endl;
}

bub2(p, 10);				//对原序列中的第11到第40个元素进行排序
cout << "排序后的序列:" << endl;
for (i = 0; i < 10;i++)
{
for (j = 0; j < 5; j++)cout << setw(10) << p[5 * i + j];
cout << endl;
}

return 0;
}


1.2 快速排序

算法情景:将一个无序的数组进行快速排序

算法思路:

编码:

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