优化策略一
对应bubleSort1
如果这一次比较没有发生交换就说明数组有序,就break
优化策略二
对应bubleSort2
如果比较到某个位置之后没有发生交换,说明这个位置以后的排列是有序的,下次比较从第一个到这个位置即可。
优化策略三
对应bubleSort3
双向比较,又名鸡尾酒排序。
#include<iostream>
using namespace std;
template<class T>
int getArrayLen(T& a)
{
return sizeof(a) / sizeof(a[0]);
}
void exchange(int arr[], int i, int j,int length)
{
if (i >= length || j >= length)
{
cout << "IndexOutOfBounds";
}
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 冒泡排序
int * bubbleSort(int arr[],int length)
{
for (int i = 1; i < length; i++)
{
for (int j = 0; j < length - 1; j++)
{
if (arr[j] > arr[j + 1])
{
exchange(arr, j, j + 1,length);
}
}
}
return arr;
}
int * bubbleSort1(int arr[], int length)
{
bool isOrdered = true;
for (int i = 1; i < length; i++)
{
isOrdered = true;
for (int j = 0; j < length - 1; j++)
{
if (arr[j] > arr[j + 1])
{
exchange(arr, j, j + 1,length);
isOrdered = false;
}
}
if (isOrdered == true)
break;
}
return arr;
}
int * bubbleSort2(int arr[], int length)
{
bool isOrdered = true;
int pos = 0;
int k = length - 1;
for (int i = 1; i < length; i++)
{
isOrdered = true;
for (int j = 0; j < k; j++)
{
if (arr[j] > arr[j + 1])
{
exchange(arr, j, j + 1, length);
pos = j;
isOrdered = false;
}
}
if (isOrdered == true)
break;
k = pos;
}
return arr;
}
int * bubbleSort3(int arr[], int length)
{
bool isOrdered = true;
int pos = 0;
int k = length - 1;
int n = 0;
for (int i = 1; i < length/2; i++)
{
isOrdered = true;
for (int j = n; j < k; j++)
{
if (arr[j] > arr[j + 1])
{
exchange(arr, j, j + 1, length);
pos = j;
isOrdered = false;
}
}
k = pos;
if (isOrdered == true)
break;
for (int j = pos; j > n; j--)
{
if (arr[j] < arr[j - 1])
{
exchange(arr, j, j - 1,length);
isOrdered = false;
}
}
n++;
if (isOrdered == true)
break;
}
return arr;
}
void display(int arr[],int length)
{
for (int i = 0; i < length; i++)
{
cout << arr[i]<<" ";
}
cout << endl;
}
int main()
{
int arr1[] = { 6, 8, 2, 3, 4, 8, 1, 9, 0, 6, 5, 10, 89 };
int arr2[] = { 6, 8, 2, 3, 4, 8, 1, 9, 0, 6, 5, 10, 89 };
int arr3[] = { 5, 2, 4, 3, 6, 7, 8 };
int len1 = getArrayLen(arr1);
int len2 = getArrayLen(arr2);
bubbleSort2(arr1,len1);
//BubbleSort(arr3, len2);
bubbleSort3(arr2,len2);
display(arr1,len1);
display(arr2,len2);
system("pause");
return 0;
}