冒泡排序法
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
//冒泡排序
void bubbleSort(int* arr, int n)
{
//从小到大排,每次找出最大的
//外层循环是排序总趟数,每次排一个,总共排n-1次
for (int i = 0; i < n-1; i++)
{
//内层循环写一趟比较次数
for (int j = 0; j < n-1-i; j++)
{
//如果前面的比后面的大则交换
if (arr[j] > arr[j+1])
{
swap(arr[j + 1], arr[j]);
}
}
}
}
插入排序法
从前往后遍历,每次把后面小的数插入前面合适的位置
//插入排序
void insertSort(int* arr, int n)
{
//从下一个开始,判断该数字是否有序,无序则把该数字向前找到合适的位置插入
//从前往后排
//外层循环控制判断总次数
for (int i = 0; i < n-1; i++)
{
//如果下一个数字无序,则进行插入排序
if (arr[i + 1] < arr[i])
{
//从后向前插入
for (int j = i+1; j > 0; j--)
{
//如果当前值比前面的小,则交换
if (arr[j]<arr[j-1])
{
swap(arr[j], arr[j - 1]);
}
else
{
break;
}
}
}
}
}
选择排序
顾名思义:每次选最小的直接和顺序位置交换
//选择排序
void selectionSort(int* arr, int n)
{
//每次找到最大的和最后一位做交换
//首先对最后一个数做标记
int end = n - 1;
//max是单趟中最大数的下标
int max = 0;
//外层循环控制趟数,每次排一个最大值
for (int i = 0; i < n-1; i++)
{
//设第一个是最大的数
max = 0;
//内层循环控制比较的次数,找到最大值的下标
for (int j = 0; j < n-1-i; j++)
{
//如果下一个数比当前数大则重置最大的数的下标
if (arr[j+1] > arr[max])
{
max = j+1;
}
}
//交换
swap(arr[max], arr[end--]);
}
}
附: