一、冒泡排序
过程简述:通过n趟循环,每趟比较相邻俩元素之间的大小,顺序错误则交换,否则继续。
c++模板:
void BubbleSort(int arr[], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j + 1] < arr[j])
swap(arr[j], arr[j + 1]);//C++中提供swap函数实现两数交换
}
}
}
过程动画:
时间复杂度:O()
二、选择排序
过程简述:通过n-1次找最小实现
C++模板:
void ChoiceSort(int arr[], int n)
{
int i, j;
for (i = 0; i < n-1; i++)
{
int min = i;//记录找到的最小值下标
for (j = i + 1; j < n; j++)
{
if (arr[j] < arr[min])
min = j;
}
if(min!=i)
swap(arr[i], arr[min]);
}
}
过程动画:
时间复杂度:O()
三、插入排序
过程简述:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。类似于插扑克牌。
C++模板:
void InsertionSort(int arr[], int n)
{
int i, j;
int k;//当前待排元素
for (i = 0; i < n - 1; i++)
{
k = arr[i + 1];
j = i;
while (j >= 0 && k < arr[j])
{
arr[j + 1] = arr[j];//将当前元素后移一位
j--;
}
arr[j + 1] = k;
}
}
过程动画:
时间复杂度: O()
四、快速排序
过程简述:找一个基准数,并将整个数组分为两部分,其中一部分的所有元素都比基准数小,另一部分都比基准数大。再采用递归的方法实现对两子部分的排序,一直到整体有序。
C++模板:
void QuickSort(int arr[], int l, int r)
{
if (l >= r)return;
int x = arr[l + r >> 1];//基准数
int i = l - 1, j = r + 1;
while (i < j)
{
do i++; while (arr[i] < x);
do j--; while (arr[j] > x);
if (i < j) swap(arr[i], arr[j]);
}
QuickSort(arr,l, j),QuickSort(arr,j + 1, r);
}
过程动画:
时间复杂度:
五、归并排序
过程简述:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。
C++模板:
void MergeSort(int arr[], int l, int r)
{
if (l >= r) return;
int temp[r-l+1];
int mid = l + r >> 1;
MergeSort(arr, l, mid), MergeSort(arr, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
{
if (arr[i] < arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= r) temp[k++] = arr[j++];
for (i = l, j = 0; i <= r; i++, j++)
arr[i] = temp[j];
}
过程动画:
时间复杂度: