在生活中,经常会需要对一些东西排序,比如:体检时会将等人的视力分好坏排序;上课时,老师会根据作业提交的顺序与准确率进行排序;我们的洛谷账号也会由于咕值的多少来用名字颜色进行排序。因为有了排序所以就可以将毫无顺序的东西整理的有序,方便比较与统计。
接下来给大家讲几种排序
1.选择排序
选择排序就是要把一组数据中的第一个数据与最小数据交换,然后把交换的数据固定,再把除固定数据以外的第一个数据与剩下数据中的最小值进行比较,并进行交换,直到已排序的数据后面的数据是整组数据中最大的。这就是选择排序。
我们看到洛谷P1177这道题前往原题
P1177 【模板】排序
要我们把读入的N个数从小到大排序后输出。
输入输出样例:
输入 #1
5
4 2 4 5 1
输出 #2
1 2 4 4 5
用选择排序就直接去模拟把最小值交换的过程就行
废话不多说上代码:
for(int i = 0; i <= n - 1; i++) { //嵌套循环
for(int j = i + 1; j < n; j++)
if(a[j] < a[i]) {
int m = a[i];
a[i] = a[j];
a[j] = m;
}
}
时间和空间复杂度我也懒得写忘了。
冒泡排序
冒泡排序也不难,冒泡排序就是比较一组数据中相邻的两个元素,小的放前,大的放后,固定他俩的位置,在比较后两个,比到头之后再比较最后一个和最后一个-1的元素,小的放前,大的放后,直到比较出大小,最后输出即可,为什么要叫做“冒泡排序”呢,因为他是把这组数据中最大的想成泡泡,让他一直往后飘。
可用冒泡排序来解决1174这道题。
for(int i = 0; i < n - 1; i++) { //嵌套循环
for(int j = 0; j < n - i - 1; j++)
if(a[j] < a[i]) {
int m = a[j];
a[i] = a[j + 1];
a[j + 1] = m;
}
}
跟选择排序差不多。
插入排序
插入排序是把一组数据中第2个元素放到第一个元素前(就是插入过来)也相当于把第二个元素移到第2个元素那里,固定位置,后面的也一样,把所有位置交换后,再返回来把最后一个-1的元素,与这个元素-1的元素进行插入和移动,一个一个的比,最后输出就行。
接着上代码:
for(int i = 1; i < n; i++) { //嵌套循环
long long c = a[i],j //别问我为什么要定义,因为要把没有插得牌存着,等下还要放进去。
for(int j = i - 1; j >= 0; j--) //这里得用j--
if(a[j] > c)
a[j + 1] = a[j];
else break;//跳出
a[j + 1] = c;
}
代码其实没很大区别。