1.插入排序
希尔排序
不稳定
用元素个数/2 然后得到一个步长 步长之间两两为一组(8个元素那就是4)
然后将他们两两比较,大的放后面小的放前面,得到一个序列
再让步长除以(4/2=2) 步长为2 再分两组
第二趟

第三趟如果还是乱序
那就再除以2 2/2变1 然后两两比较 最后得到一个有序序列
cpp
void ShellSort(int arr[], int sz)
{
int d, i, j;
//d表示步长,比如8个元素,那就arr[0]和arr[3]比较
//比较完一次再将步长/2不断缩小
for (d = sz / 2; d >= 1; d = d / 2)
{
// 对每个子序列进行插入排序
for (i = d; i < sz; i++)
{
int temp = arr[i]; // 保存当前元素
// 插入排序逻辑
for (j = i - d; j >= 0 && temp < arr[j]; j = j - d)
{
arr[j + d] = arr[j]; // 将较大的元素向后移动
}
arr[j + d] = temp; // 插入当前元素到正确位置
}
}
}
直接插入排序
cpp
//直接插入排序
//1.i从1开始往后遍历
//2.元素两两比较 如果前一个元素大于后一个
//3.将后一个元素保存到temp 前面的元素往后移动
//4.最后将temp赋值给arr[j+1]
void InsertSort(int arr[], int sz)
{
int i, j, temp;
for ( i = 1; i < sz; i++)
{
if (arr[i] < arr[i - 1])
{
temp = arr[i];
//i-1表示当前元素和前一个元素比
for ( j = i - 1; j >= 0 && temp < arr[j]; j--)
{ //将元素往后移动
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
2.交换排序
冒泡排序
通过
flag
提前结束排序,提高了算法的效率。最好情况(数组已经有序):时间复杂度为 O(n)O(n),只需要一轮比较。
最坏情况(数组完全逆序):时间复杂度为 O(n2)O(n2),需要 n−1轮比较和交换。
cpp
BubbleSort(int arr[], int sz)
{
for (int i = 0; i < sz - 1; i++)
{
int flag = 0;
for (int j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1;
}
}
if (flag == 0)
break;
}
}
快速排序
首先拿出第一个元素作为基准,那么第一个位置就空出来了
然后从右往左 和 基准元素进行比较
比基准元素小的就放到arr[0]的位置,反之该元素不动
high--不断往左,low++不断往前直到最后两个相遇
第一趟排序后 将一个序列分成两个子序列 不断重复上述步骤(递归)

cpp
void QuickSort(int arr[], int low, int high)
{
if (low < high)
{ //pivotpos记录基准的位置,将该序列分成两部分
int pivotpos = Partition(arr, low, high);
//左部分,不断递归调用进行排序
QuickSort(arr, low, pivotpos - 1);
//右部分
QuickSort(arr, pivotpos+1, high);
}
}
int Partition(int arr[], int low, int high)
{
//将第一个元素作为中心点拿出来
//和其他元素进行比较
int pivot = arr[low];
while (low<high)
{ //该判断语句表示在右边的元素大于基准元素
//则不用动 high减一
while (low < high && arr[high] >= pivot)
high--;
//直到找到比较小的元素就将该元素赋值给low
arr[low] = arr[high];
while (low < high && arr[low] <= pivot)
low++;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}