各個排序算法分析與優化:
(全部以升序爲例子)
1.冒泡排序:
算法:從頭開始比較每一對相鄰元素,如果第一個元素比第二個元素大,就交換他們的位置。
代碼演示:
void test01()
{
int array[] = { 56,9,10,19,28,37,34 };
int length = sizeof(array) / sizeof(int);
for (int end = length - 1; end > 0; end--)
{
for (int begin = 1; begin <= end; begin++)
{
if (array[begin] < array[begin - 1])
{
int tmp = array[begin];
array[begin] = array[begin - 1];
array[begin - 1] = tmp;
}
}
}
for (int i = 0; i < length; i++)
{
cout << array[i] << "_";
}
}
冒泡優化1:
//冒泡排序優化1
void test02()
{
int array[] = { 56,9,10,19,28,37,34 };
int length = sizeof(array) / sizeof(int);
for (int end = length - 1; end > 0; end--)
{
bool flags = true;//假設每次否是排好序的
for (int begin = 1; begin <= end; begin++)
{
if (array[begin] < array[begin - 1])
{
int tmp = array[begin];
array[begin] = array[begin - 1];
array[begin - 1] = tmp;
//如果有交換 代表沒有排好序
flags = false;
}
}
if (flags == true)
{
break;
}
}
for (int i = 0; i < length; i++)
{
cout << array[i] << "_";
}
}
冒泡優化2:
//冒泡排序優化2
void test03()
{
int array[] = { 56,9,10,19,28,37,34 };
int length = sizeof(array) / sizeof(int);
for (int end = length - 1; end > 0; end--)
{
int sortedIndex = 1;
for (int begin = 1; begin <= end; begin++)
{
if (array[begin] < array[begin - 1])
{
int tmp = array[begin];
array[begin] = array[begin - 1];
array[begin - 1] = tmp;
sortedIndex = begin;
}
}
end = sortedIndex;
}
for (int i = 0; i < length; i++)
{
cout << array[i] << "_";
}
}
選擇排序:
算法:
//選擇排序+穩定性
void test11()
{
int array[] = { 56,56,9,10,19,28,37,34 };
int length = sizeof(array) / sizeof(int);
for (int end = length - 1; end > 0; end--)
{
int maxIndex = 0;
for (int begin = 1; begin <= end; begin++)
{
if (array[maxIndex] <= array[begin])
{
maxIndex = begin;
}
}
int tmp = array[maxIndex];
array[maxIndex] = array[end];
array[end] = tmp;
}
for (int i = 0; i < length; i++)
{
cout << array[i] << "_";
}
}