持续更新一些学习C++和算法的经验,以及在写代码中遇到的问题,欢迎大家相互讨论、指导。
前言
通过这篇博客,我将带大家了解有关排序的内容,并提供一些模板,可以让我们更好的了解排序。
排序是算法中比较基础的一项内容,简单来说排序就是将一个无序数列按照某种规则进行有序排列。
我将会从冒泡排序、选择排序、插入排序这三种排序种,带大家依次了解排序。
一、冒泡排序
1.描述
冒泡排序的本质就在于交换,即每次通过交换的方式把剩余元素的最大值移动到一端,而当剩余元素为0时,结束排序。
2.例图
通过图片我想大家可以更直观的了解冒泡排序(@图片来自菜鸟教程)
3.代码
//冒泡排序
#include <iostream>
using namespace std;
int main()
{
int arr[] = {6,5,3,8,9,7,15,2,4,1};
int sz = sizeof(arr) / sizeof(arr[0]); //(1)
for (int i = 0; i < sz - 1; i++) //(2)
{
for (int j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1]) //(3)
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i <= sz; i++) //(4)
{
printf("%d ", arr[i]);
}
return 0;
}
4.代码详解
(1)通过sizeof函数计算整个数组的大小,再计算数组第一位的大小(int的值是4字节)
所以:40 / 4 = 10 由此,求出数组中共有10个数。
(2)外层循环排多少次,内层循环表示比较的两个数。
(3)通过对比两个数的大小来进行交换,如果前面的数大于后面的数则执行if内的代码进行数值交换。直到将这个排序的最大数交换至最后一位。
(4)遍历输出排序后的数组
二、选择排序
1.描述
选择排序是最简单的排序算法之一。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。
2.例图
通过图片我想大家可以更直观的了解选择排序(@图片来自菜鸟教程)
3.代码
#include <iostream>
using namespace std;
int main()
{
int arr[] = {6,5,3,8,9,7,15,2,4,1};
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz - 1; i++)
{
for (int j = i + 1; j < sz; j++)
{
if (arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0; i <= sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三、插入排序
1.描述
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
2.例图
通过图片我想大家可以更直观的了解插入排序(@图片来自菜鸟教程)
3.代码
#include <iostream>
using namespace std;
int main()
{
int arr[] = {1,5,6,8,9,7,4,2 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 1; i<sz; i++){
int t = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > t){
arr[j + 1] = arr[j];
arr[j] = t;
j--;
}
}
for (int i = 0; i < sz; i++){
printf("%d ", arr[i]);
}
return 0;
}
总结
通过这三种例子,我相信大家一定对排序有了基本的认识。