目录
排序是计算机内经常进行的一种操作,其目的是将一组
“
无序
”的记录序列调整为
“
有序
”的记录序列。分为内部排序和外部排序。
内部排序:若整个排序过程不需要访问外存便能完成。外部排序: 若参加排序的记录数量很大,整个序列的排 序过程不可能在内存中完成。
简而言之,
将杂乱无章的数据元素,通过一定的方法按照关键
字顺序排列的过程叫做排序。
十大经典排序分别是冒泡排序,插入排序,选择排序,希尔排序,计数排序,基数排序,桶排序,快速排序,归并排序和堆排序。
十大排序算法分为比较类和非比较类排序:
比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O(nlogn) ,因此也称为非线性时间比较类排序。非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线 性时间运行,因此也称为线性时间非比较类排序。(非比较类排序有计数排序,桶排序,基数排序)
排序的稳定性
排序按照稳定性分为稳定的排序算法和不稳定的排序算法。
重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过
来。走访数列的工作是重复地进行直到没有再需要交换,也就
是说该数列已经排序完成。
算法思路:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
C++代码实现:
#include<iostream>
const int N = 110;
int arr[N];
void bubble_sort(int arr[],int l,int r){
int len = r - l + 1; //数组长度
for (int i = 0; i < len - 1; i++)//n-1次循环
{
/* code */
for (int j = 0; j < len - 1 - i; j++)//第二个指针,每一轮都会有一个数字被排好
{
if (arr[j] > arr[j + 1])
{
std::swap(arr[j],arr[j + 1]);//两两交换
/* code */
}
}
}
}
int main()
{
//首行输入一个数字n(代表要排序的个数)
//次行输入n个数(代表要排序的数字)
int n;
system("chcp 65001");//解决中文编码乱码
std::cout << "输入排序的数字个数:"<< std::endl;
std::cin >> n;
std::cout << "输入排序的数字"<<std::endl;
for (int i = 0; i < n; i++) std::cin >> arr[i];
bubble_sort(arr,0,n-1);
for (int i = 0; i < n; i++) std::cout << arr[i] << " ";
}
运行结果:
Active code page: 65001
输入排序的数字个数:
5
输入排序的数字
3 5 2 4 1
1 2 3 4 5
Python代码实现:
def bubble_sort(num:list[int]) -> None:
#获取数据的长度(所要排序的数字的个数)
len_num = len(num)
for i in range(len_num - 1):
#里面控制比较次数
for j in range(len_num - 1 - i):
#判断数据是否需要交换
if num[j] > num[j + 1]:
num[j],num[j + 1] = num[j + 1],num[j]
if __name__ == '__main__':
num = list(map(int,input().split()))
bubble_sort(num)
print(num)
运行结果:
PS E:\VScode> & C:/Users/lenovo/AppData/Local/Programs/Python/Python310/python.exe e:/VScode/Python/sort/bubble_sort.py
6 7 5 3 8
[3, 5, 6, 7, 8]
冒泡排序:时间复杂度:O(n^2) 空间复杂度:O(1)