1、经典的冒泡排序
外层循环控制大排序次数,
内层循环控制每次大排序的排序次数
一次大排序就可以把最小的数据放在最前面。
1)对数组中的各数据,依次比较相邻的两个元素的大小
2)如果前面的数据大于后面的数据,就交换着两个数据。经过第一轮大排序后,便可把最小的数据排好。
3)然后再用同样的方法吧剩下的数据逐个比较,最后得到从小到大排好的数组。
void BubbleSort(int *a, int len)
{
int i, j, temp, k;
for (i = 0; i < len - 1; i++)
{
for (j = len - 1; j > i; j--) // 排好的数据放在了前面(冒出来了),所以新的一轮排序不需要再对下标小于i的数据进行比较
{
if (a[j - 1] > a[j])
{
temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
for (k = 0; k < len; k++)
cout << a[k] ;
cout << endl;
}
}
2、选择排序算法
通过选择和交换来实现排序。
1)首先从原始数组中选择最小的一个数据,将其和位于第1个位置的数据交换
2)接着从剩下n-1个数据中选择次小的一个元素跟第2个位置的数据交换
3)然后,不断重复,直到最后两个数据完成交换
void SeclectSort(int *a, int len)
{
int i, j, k;
int temp;
for (i = 0; i < len - 1; i++)
{
k = i; // 记录下当前开始比较的位置,下标小于i的位置已经排好序
for (j = i + 1; j < len; j++)
{
if (a[j] < a[k])
k = j; // 记录下此轮排序中的最小值的下标
}
if (k != i) // 将当前大排序中最小的数放在下标为i的位置上
{
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
3、基于数组的插入排序
1)首先都数组的前两个数据进行从小到大的排序
2)接着将第3个数据与排好序的两个数据比较,将第3个数据插到合适的位置
3)然后,将第4个数据插入到已排好序的前三个数据当中
4)不断重复上述过程,直到把最后一个元素插入到合适位置。
void InsertionSort(int *a, int len)
{
int i, j, temp;
for (i = 1; i < len; i++)
{
j = i - 1; //j为当前大排序中的已排序序列的最后一个元素的下标
temp = a[i]; // temp为当前待插入的数
while (j >= 0 && temp < a[j]) //j>=0保证不出界,且当前待插入的数temp比a[j]小,则继续寻找temp要插入的位置j
{
a[j + 1] = a[j]; // temp值比较小,则a[j]向后移动,并更新位置j
j--;
}
a[j+1] = temp; //退出while的时候j已经做了一次自减(j--),所以退出while代表找到了比temp小元素(下标为j),则将temp放在j的后面。
}
}