常规的选择排序和冒泡排序通常都做了许多无用功,在选择排序中,就算元素已经排列好了,for循环还是会执行n-1次,在查找最大元素的时候,可以顺便检查元素是否已经按序排列。代码如下:
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class T>
void SelectionSort(T a[], int n)
{
bool sorted = false;
for (int size = n; !sorted && (size > 1); size--)
{
int pos = 0;
sorted = true;
for (int i = 1; i < size;i++)
if (a[pos] <= a[i]) pos = i;
else sorted = false;
swap(a[pos], a[size - 1]);
}
}
测试代码:
int main()
{
int T1[10] = { 3, 23, 75, 2, 53, 24, 25, 2, 563, 8 };
SelectionSort(T1, 10);
for (int i = 0; i < 10; i++)
{
cout << T1[i];
cout << "\n";
}
return 0;
}
在冒泡排序中,如果元素没有互换,说明已经按序排列了,没有必要再冒泡。代码如下:
template <class T>
bool Bubble(T a[],int n)
{
bool swapped=false;
for(int i=0;i<n-1;i++)
if(a[i]>a[i+1]){
swap(a[i],a[i+1]);
swapped = true;
}
return swapped;
}
template<class T>
void BubbleSort(T a[],int n)
{
for (int i=n;i>1&&Bubble(a,i);i--);
}