目录
1.冒泡排序
2.选择排序
3.插入排序
4.快速排序
5. sort排序
冒泡排序是一种交换排序,即相邻两个数比较,根据大小交换位置
以下代码示例了冒泡排序
//这是一个冒泡排序
void bubble_sort(int a[],int len)
{
for (int i = 0; i < len; i++)//len轮循环,每次将最大的数移至最后
for (int j = 0; j < len - 1 - i; j++)//每进行一次循环,排好的数+1,循环的次数-1
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);//交换
}
例如我们选定第一个数字,然后让它与后面每一位数字进行比较,每次循环让最大或是最小的数
字与它进行交换,以下为代码示例
//这是一个选择排序
void selection_sort(int a[],int len)
{
for (int i = 0; i < len; i++)//len轮循环,每次将最小的数移至最前
{
int min = i;//min为未排序的数中最小项下标
for (int j = i+1; j < len; j++)
if (a[j] < a[min])
min = j;
swap(a[min], a[i]);//将最小项与第j项交换
}
}
玩扑克牌时,我们往往将新抽到的牌插到有序的牌组里,插入排序就是用了这一想法
以下代码模拟了这一过程
//这是一个插入排序
void insertion_sort(int a[],int len)
{
for (int i = 1; i < len; i++)
{
int now = a[i],j;//a[i]为现在待插牌,也就是有序区域的后一个数
for (j = i - 1; j >= 0; j--)//从有序区域的最后一个数向前遍历
{
if (now < a[j])
a[j + 1] = a[j];//比待插牌大的牌全部向后移一位从而留出一个空隙
else
{
a[j+1] = now;//将待插牌插入空隙
break;
}
}
}
}
对于一个无序序列,找到一个数作为哨兵数,将序列中所有比哨兵数小的数都放在哨兵数左边, 所有比哨兵数大的数都放在哨兵数右边,然后对哨兵数左边和右边用相同的方法进行排序(递 归),代码如下
//这是一个快速排序
void quick_sort(int a[], int left,int right)//left,right表示左右下标
{
int i = left, j = right, flag = a[(left + right) / 2];//flag表示哨兵数
do {
while (a[i] < flag)i++;
while (a[j] > flag)j--;
if (i <= j)
{
swap(a[i], a[j]);
i++;
j--;
}
}while (i <= j);
if (left< j)quick_sort(a, left, j);//哨兵数左边递归
if (i < right)quick_sort(a, i, right);//哨兵数右边递归
}
sort函数是C++标准库里的排序方法,是快速排序的优化
在包含算法头文件
sort()有两种使用方法
第一种:
sort(a, a+5);//从小到大排序
sort(a, a + 5,greater());//从大到小排序
第二种:
重定义cmp进行自定义比较
例如对结构体排序,代码如下
#include
#include
using namespace std;
struct Student//定义结构体
{
string name;
int age;
};
bool cmp(Student a,Student b)//重写cmp函数,以age从小到大排序
{
return a.age < b.age;
}
int main()
{
Student student[5]={"小a",19,"小b",18,"小c",15,"小d",18,"小e",16};
sort(student, student + 5, cmp);//对结构体对象进行排序
for (int i = 0; i < 5; i++)
{
cout << "name:" << student[i].name << " "
<< "age" << student[i].age << endl;
}
}
程序执行结果
name:小c age15
name:小e age16
name:小b age18
name:小d age18
name:小a age19
Thank You!