1.冒泡排序
#include<iostream>
using namespace std;
void bubble_sort(int arr[], int len)//冒泡排序
{
for (int i = 1; i < len - 1; i++)//第i轮排序,i个数需要排i-1轮
{
int is_ordered = 0;//效率优化:如果在某一轮没有执行任何交换操作,说明排序已经完成,直接返回结果
for (int j = 0; j < len - i; ++j)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
is_ordered = 1;
}
}
if (!is_ordered)break;
}
}
void traverse_sort(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << '\n';
}
int main()
{
int score[] = { 10,80,30,9,150,7 };
select_sort(score, sizeof(score) / sizeof(score[0]));
traverse_sort(score, sizeof(score) / sizeof(score[0]));
return 0;
}
2.插入排序
void insert_sort(int arr[], int len)//插入排序
{
for (int i = 1; i < len; ++i)//第i次插入
{
int base = arr[i];
for (int j = i; j >= 0; j--)//已完成i个排序,需要做i次判断
{
if (arr[j] > base)
{
arr[j + 1] = arr[j];
arr[j] = base;
}
}
}
}
3.选择排序
void select_sort(int arr[], int len)
{
for (int i = 0; i <len - 1; ++i)//插入第i个坑位
{
int min = i;//假设坑位上的数最小 下标记为 min
for (int j =i+1; j <= len-1 ; j++)//遍历 待插入元素 找到最小的元素 更新下标
{
if (arr[j] < arr[min])
{
min = j;
}
}
int tmp = arr[i];//将坑位上的数与更小的数交换
arr[i] = arr[min];
arr[min] = tmp;
}
}
4.快速排序
int partition(int arr[], int low, int high)//将数组分为左右两个半区,左边半区值小于基准值,右边则大于基准值
{
int i = low;
int j = high;
int p = (i + j) / 2;
int pivot = arr[p];
while (i < j)
{ //i 的变化
while (i < p && arr[i] < pivot)
i++;
//循环退出,小于基准值的元素应该在左边
arr[p] = arr[i];
p = i;
//j 的变化
while (j > p && pivot < arr[j])
j--;
//循环退出,大于基准值的元素应该在右边
arr[p] = arr[j];
p = j;
}
//i == j == p;
arr[p] = pivot;
return p;
}
void quick_sort(int arr[], int low, int high)
{//low:分区部分下边界 high:分区部分上边界
if (low < high)
{
int p = partition(arr, low, high);//获得第一次分区基准值的下标p
quick_sort(arr, low, p - 1);//基准值左边分区排序
quick_sort(arr, p + 1, high);//基准值右边分区排序
}
}
void traverse_sort(int arr[],int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << '\n';
}
int main()
{
int score[] = { 5,30,10,20,2,1 };
quick_sort(score, 0,sizeof(score) / sizeof(score[0])-1);
traverse_sort(score, sizeof(score) / sizeof(score[0]));
return 0;
}