作者 | 三玖天下第一
来源 | cnblogs.com/hzoi-liujiahui/p/13256439.html
1、冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1.1 算法描述
n个元素的序列,经过n-1趟选择排序得到有序结果。具体算法描述如下:
初始状态:无序区为R[1..n],有序区为空;
每一轮从无序区起点开始,相邻元素两两比较,如果前面的比后面的元素大就交换,直到无序区最后。
针对所有的元素重复以上的步骤,每一轮冒泡操作无序区域元素减一,有序区元素减一;
重复执行n-1轮,序列变为有序。
1.2 动图演示
1.3 代码实现
#include const int maxn=1e4+5,Inf=2147483647;int a[maxn];int n;void Read(){scanf("%d",&n);
srand(time(0));for(int i=1;i<=n;++i)
a[i]=rand()%10000;
}void Print(){for(int i=1;i<=n;++i)printf("%d ",a[i]);
}void Bubble_sort(int a[]){for(int i=1;i//经过n-1轮的冒泡操作
for(int j=1;j<=n-i;++j)//没操作一轮,待排序的少一个
if(a[j]>a[j+1])
std::swap(a[j],a[j+1]);
}
}
void Solve(){
Read();
Bubble_sort(a);
Print();
}
int main(){
Solve();
return 0;
}
2.选择排序
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
2.1 算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
初始状态:无序区为R[1..n],有序区为空;
第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
n-1趟结束,数组有序化了。
2.2 动图演示
2.3 代码实现
#include
const int maxn=1e4+5,Inf=2147483647;
int a[maxn];
int n;
void Read(){
scanf("%d",&n);
srand(time(0));
for(int i=1;i<=n;++i)
a[i]=rand()%10000;
}
void Print(){
for(int i=1;i<=n;++i)
printf("%d ",a[i]);
}
void Select_sort(int a[]){
int k=0;
for(int i=1;i//n-1轮,每一轮找到一个最小的
k=i;//k指向未排序的最小for(int j=i+1;j<=n;++j)if(a[k]>a[j])
k=j;std::swap(a[i],a[k]);
}
}void Solve(){
Read();
Select_sort(a);
Print();
}int main(){
Solve();return 0;
}