一.冒泡排序
1.1,泡沫排序可以形象的理解为:较小的值像气泡一样逐渐的上浮到数组的顶部,或者较大的值逐渐下沉到数组底部。这种排序技术需要逐渐排序好几轮,每一轮都要比较连续的数组元素对。按要求交换它们的值。
1.2,冒泡排序法比较易于实现,但是不论情况好坏,都要进行所有轮的比较,运行速度较慢。
#include <iostream>
using namespace std;
// 冒泡排序法
void bubble(int a[], int size);
int main()
{
int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
int len = sizeof(array) / sizeof(int); // 计算元素个数
for (int i = 0; i < len; i++) // 元素顺序输出
{
cout << array[i] << ",";
}
cout << "\n\n";
bubble(array, len);
system("pause");
return 0;
}
void bubble(int a[], int size)
{
for (int pass = 1; pass < size; pass++)
{ // 共比较size-1轮
for (int i = 0; i < size - pass; i++)
{ // 比较一轮
if (a[i] > a[i + 1])
{
int temp = a[i]; // 交换元素
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
for (int i = 0; i < size; i++)
{ // 比较一轮后输出
cout << a[i] << ",";
}
cout << endl;
}
}
二.插入排序
2.1,插入排序通过把数组中的元素插入到适当的位置来进行排序。
首先:(1)将数组中的前两个元素按顺序排序,(2)把下一个元素(第3个)插入到其对应于已排序元素的排序位置,(3)对于数组中的每个元素重复步骤(2)
2.2,所谓插入过程,就是待插元素与左边元素不断比较及挪移的过程。若小于,则左边元素挪移到右边,若不小于,则将待插元素安顿在右边而结束。
2.3,排序函数isort()中的inserter是待插入元素,index是当前准备与插入元素比较的元素下标。
挪位是赋值操作,不是交换操作,所以工作量减轻很多。但是插入排序的每轮比较都是不可缺少的,无法进一步优化算法。
#include <iostream>
using namespace std;
// 插入排序
void isort(int a[], int size);
int main()
{
int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
int len = sizeof(array) / sizeof(int); // 计算元素个数
for (int i = 0; i < len; i++) // 元素顺序输出
{
cout << array[i] << ",";
}
cout << "\n\n";
isort(array, len); // 调用排序函数
system("pause");
return 0;
}
void isort(int a[], int size) // 插入排序
{
for (int i = 1; i < size; i++) // 共执行size-1轮
{
int ins = a[i], idx = i - 1;
for (; idx >= 0 && ins < a[idx]; idx--)
{
a[idx + 1] = a[idx]; // 后挪一个位置
}
a[idx + 1] = ins; // 插入
for (int j = 0; j < size; j++) // 比较一轮后输出
{
cout << a[j] << ((j == i) ? "|" : ","); // ‘|’为已排未排分界线
}
cout << endl;
}
}
三.快速排序
3.1,快速排序法被认为是效率较高的排序算法
3.2,快速排序是建立在把数组分为许多部分的思想上。
#include <iostream>
using namespace std;
// 快速排序
void qsort(int a[], int left, int right);
int main()
{
int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
int len = sizeof(array) / sizeof(int);
for (int i = 0; i < len; i++)
{ // 原始顺序输出
cout << array[i] << ",";
}
cout << "\n";
qsort(array, 0, len - 1);
for (int i = 0; i < len; i++)
{
cout << array[i] << ","; // 排序结果输出
}
cout << endl;
system("pause");
return 0;
}
void qsort(int a[], int left, int right)
{
int pivot = a[right], l = left, r = right, temp;
while (l < r)
{
temp = a[l], a[l] = a[r], a[r] = temp; // 交换
while (l < r && a[r] > pivot)
--r;
while (l < r && a[l] <= pivot)
++l;
}
temp = a[left], a[left] = a[r], a[r] = temp; // 使a[r]成为分界元
if (left < r - 1)
qsort(a, left, r - 1);
if (r + 1 < right)
qsort(a, r + 1, right);
}