标签:sort 思路 用两个 inf for alt 自己的 == ios
用随机函数生成16个2位正整数(10~99),利用双向冒泡排序法将其排序。
在我看来双向冒泡排序就是冒泡排序的一个小改变,并不是改进优化。
每一趟排序分成两个部分,同时在得到最后的有序序列前,把有序序列分成两部分,一部分在原无序序列后(和普通冒泡排序一样),一部分在原无序序列前。最后将有序序列①和有序序列②合并。
排序①(和普通冒泡排序一样),从左到右通过无序序列中元素的比较和交换位置,将无序序列中最大的元素移到最后,将其更新为有序序列②中的最小元素。
排序②,从右到左通过无序序列中元素的比较和交换位置,将无序序列中最小的元素移到最前,将其更新为有序序列①中的最小元素。
1.引入一个无序序列
2.第一趟
3.第二趟
4.第三趟
5.(省略n步)最后一趟
所以时间复杂度为O(n2);
下面的代码是我按照自己的思路进行编写的,算法效率能达到应有的程度。
空间复杂度为O(1),移动时需要辅助空间。
#include<iostream>
#include<ctime>
using namespace std;
void DoubleBubbleSort(int* array, int n)
{
//记录比较次数和移动次数
int recordMove = 0;
int recordCompare = 0;
//标记排序是否发生交换
//若不发生交换
//则某一部分的排序完成
int flag_1 = 1;
int flag_2 = 1;
while ((flag_1 == 1 || flag_2 == 1) && n - 1 > 0)
{
//若没有发生交换
//flag为0,则不会发生下一趟排序
//将最大的数移到最后
if (flag_1 == 1)
{
flag_1 = 0;
for (int i = 16 - n + 1; i < n; i++)
{
recordCompare++;
if (array[i] > array[i + 1])
{
flag_1 = 1;
array[0] = array[i];
recordMove++;
array[i] = array[i + 1];
recordMove++;
array[i + 1] = array[0];
recordMove++;
}
}
}
//若没有发生交换
//flag为0,则不会发生下一趟排序
//将最小的数移到最前
if (flag_2 == 1)
{
flag_2 = 0;
for (int i = n - 1; i > 16 - n + 1; i--)
{
recordCompare++;
if (array[i] < array[i - 1])
{
flag_2 = 1;
array[0] = array[i];
recordMove++;
array[i] = array[i - 1];
recordMove++;
array[i - 1] = array[0];
recordMove++;
}
}
}
n--;
cout << "第" << 16 - n << "趟排序:" << endl;
for (int j = 1; j <= 16; j++)
{
if (j == 1) cout << "[ ";
if (j == n + 1) cout << "[ ";
cout << array[j] << " ";
if (j == 16) cout << "]";
if (j == 16 - n) cout << "] ";
}
cout << endl << endl;
}
cout << "比较次数:" << recordCompare << endl;
cout << "移动次数:" << recordMove << endl << endl;
}
int main()
{
//生成随机16个正整数
int positiveInteger[17];
time_t t;
srand((unsigned)time(&t));
cout << "生成16个2位正整数:" << endl;
for (int i = 1; i <= 16; i++)
{
positiveInteger[i] = (rand() % (100 - 10)) + 10;
cout << positiveInteger[i] << " ";
}
cout << endl << endl;
//双向冒泡排序
DoubleBubbleSort(positiveInteger, 16);
cout << "排序后数组:" << endl;
for (int i = 1; i <= 16; i++)
{
cout << positiveInteger[i] << " ";
}
cout << endl << endl;
system("pause");
return 0;
}
标签:sort 思路 用两个 inf for alt 自己的 == ios
原文地址:https://www.cnblogs.com/wasi-991017/p/11966863.html