![7bf126032f7eed4497910dbcbb64ff8a.png](https://i-blog.csdnimg.cn/blog_migrate/4293e58595b2a5ce56e624a207c37f13.jpeg)
来自公众号:C语言与cpp编程
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要。
时间、空间复杂度比较
![675e1bfb3196cd0d54fe3e587b6276c6.png](https://i-blog.csdnimg.cn/blog_migrate/1e674bc34958b66f626e2835a1f8c88b.jpeg)
1 冒泡排序
算法思想:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
![13c3c84e72c2939b3f95d743206f3dc2.gif](https://i-blog.csdnimg.cn/blog_migrate/a925967bdee467a571c8f7c4aa10eb25.gif)
冒泡排序动图演示
代码:
void bubbleSort(int a[], int n){ for(int i =0 ; i< n-1; ++i) { for(int j = 0; j < n-i-1; ++j) { if(a[j] > a[j+1]) { int tmp = a[j] ; //交换 a[j] = a[j+1] ; a[j+1] = tmp; } } }}
2 选择排序
算法思想:
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
- 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
- 以此类推,直到所有元素均排序完毕
![bf8d03e9fc9ef0a4ac325e3389ef21ef.gif](https://i-blog.csdnimg.cn/blog_migrate/472704d7cdde4988d9c84ecfbb3ddc6a.gif)
选择排序动图演示
代码:
function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 寻找最小的数 minIndex = j; // 将最小数的索引保存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr;}
3 插入排序
算法思想:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
![f89cc43e85dbbefebef48e11460bb202.gif](https://i-blog.csdnimg.cn/blog_migrate/772e65f380663417e93c477bff88b121.gif)
插入排序动图演示
代码:
void print(int a[], int n ,int i){ cout<