//选择排序 简单排序 不稳定
//如果有n个值进行排序 则需要n-1趟
//每一趟具体是将待排序序列中最小值找到 再将其和待排序序列的第一个值进行交换 (每一趟我们要找到的是最小值的位置 而不是最小值是多少)
void Select_Sort(int arr[], int len)
{
for (int i = 0; i < len-1;i++) //趟数
{
int min = i;
for (int j = i + 1; j < len;j++)//控制的是这一趟中对待排序序列值的遍历 从而找到待排序序列最小值所在位置
{
if (arr[j] < arr[min])
min = j;
}
if (min != i)//判断待排序序列最小值是否与第一个值相等
{
int tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}
//冒泡排序 时间复杂度o(n~2) 空间复杂度 O(1)
//如果有n个值进行排序 则需要n-1趟 简单排序 稳定
// 每一趟都从开始位置从左向右遍历 两两比较 如果左边值大于右边值 则交换 (每趟都可以将排序序列中的最大值通过两两比较交换的方式,蠕动到最后)
void Bubble_Sort(int arr[], int len)
{
for (int i = 0; i < len - 1; i++) //趟数
{
for (int j = i ; j < len-1-I; j++)//控制的是这一趟中对雨待排序序列从左向右的两两比较取值的过程
{
if (arr[j] >= arr[j + 1])//两两比较时 如果左边值>右边值 交换
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
//优化 时间复杂度 最坏O(n~2) 最好 O(n)
void Bubble_Sort(int arr[], int len)
{
bool tag = true;
for (int i = 0; i < len - 1; i++) //趟数
{
for (int j = i; j < len - 1 - I; j++)//控制的是这一趟中对雨待排序序列从左向右的两两比较取值的过程
{
if (arr[j] >= arr[j + 1])//两两比较时 如果左边值>右边值 交换
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
tag = false;
}
}
if (tag)
return;
}
}
//归并排序 分治
//归并排序 两个有序组合并成一个有序组的函数
void Merge(int arr[], int left, int mid, int right)
{
//[left, mid] [mid+1, right]
int* brr = (int*)malloc(right - left + 1);
if (NULL == brr)
exit(EXIT_FAILURE);
int i = left;
int j = mid + 1;
int k = 0;//指向brr中接收值的格子下标
while (i <= mid && j <= right)
{
if (arr[i] <= arr[j])
{
brr[k++] = arr[i++];
//i++;
//k++;
}
else
{
brr[k++] = arr[j++];
}
}
while (i <= mid)
brr[k++] = arr[i++];
while (j <= right)
brr[k++] = arr[j++];
,
for (int w = left; w <= right; w++)
arr[w] = brr[w - left];
}
//归并排序 递归分函数实现
void Divide(int arr[], int left, int right)
{
if (left >= right)
{
return; //[3 13]
}
int mid = (left + right) / 2;
Divide(arr, left, mid);//分好的左边组的范围 [left, mid]
Divide(arr, mid + 1, right);//分好的右边组的范围 [mid+1, right]
Merge(arr, left, mid, right);
}
//归并排序 递归实现方法
void Merge_Sort(int arr[], int len)
{
//执行分 递归函数
//divide merge
Divide(arr, 0, len - 1);
}