首先了解排序:
排序的定义
假设含有n个记录的序列为{r1,r2,…,rn},其相应的关键字分别是{k1,k2,…,kn},需要确定1,2,…,n的一种排列p1,p2,…,pn,使其相应的关键字满足kp1<=kp2<=…<=kpn 非递减(或非递增)的关系,即使得序列成为一个按关键字有序的序列{rp1,rp2,…,rpn},这样的操作就称为排序[1]。
简单来说,排序就是使输入的序列变成符合一定规则(关键字)的有序序列(非递减或非递增)。大多数遇到的排序问题都是按数据元素值的大小规则进行排序的问题。所以本文为了方便起见,只讨论数据元素值大小比较的排序问题。
排序的稳定性
假设ki=kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中ri领先于rj(即i<j)。
- 如果排序后ri仍领先于rj,则称所用的排序方法是稳定的;
- 反之,若可能使得排序后的序列中rj领先于ri,则称所用的排序方法是不稳定的。
简单来概括稳定和不稳定[2]:
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b前面;
- 不稳定:如果a原本在b前面,而a=b,排序之后a可能在b的后面。
时间和空间复杂度
-
时间复杂度:对排序数据的总的操作次数。反应当n变化时,操作次数呈现什么规律
-
空间复杂度:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数。
1. 冒泡排序(Bubble Sort):
1.1 一般的冒泡排序:
基本思想
比较相邻的两个元素,将值大的元素交换到右边(降序则相反)
步骤:
-
比较相邻的元素。如果第一个比第二个大,就交换它们两个;
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
-
针对所有的元素重复以上的步骤,除了最后一个;
-
重复步骤1~3,直到排序完成。
#include<stdio.h> int main(){ int n,i,j; scanf("%d",&n); int a[n]; //input for(i=0;i<n;i++){ scanf("%d",&a[i]); } //bubble sort for(i=0;i<n-1;i+&#