1.选择排序
如果要对n个数实现排序,需要用到数组。为了方便理解,假设这n个数据是n个人的身高,排序即对这n个人按高矮顺序排队,第1次,从队列中选择最矮的一个人与站在第1个位置上的人交换位置,则第1位置上的人为最矮,接下来的排序就不用去管第1人了,即n个人的队列排序问题转换为n-1个人的队列排序问题,第2次,从第2~n人中选择最矮的一个人与站在第2个位置上的人交换 置,n-1个人的队列排序问题转换为n-2个人的队列排序问题,……,第n-1个和第n个人进行比较、交换。经过n-1次选择、交换后,原队列就形成了有序的队列。这种排序方式称为选择排序。归纳上述分析,具体实现步骤如下:
(1)读入数据存放在a数组中。
(2)在a[1]~a[n]中选择值最小的元素,与第1位置元素交换,则把最小值元素放入a[1]中。内的
(3)在a[2]~a[n]中选择值最小的元素,与第2位置元素交换,则把第2大值元素放入a[2]中,……
(4)直到第n-1元素与第n个元素比较排序为止。程序实现方法:用两层循环完成算法,外层循环i控制当前序列最小他存放的数组位置,内层循环控制从1+1到n序列中选择最小的元素所在位置k。
选择排序算法对数组元素需要进行约n*n次遍历。
请认真思考后在看答案
#include<bits/stdc++.h>
using namespace std;
int n,k,a[10005],temp; //定义变量
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++) //i控制当前序列最小值存放的数组位置
{
k=i;
for(int j=i+1;j<n;j++)//j控制从i之后到n存列中选择最小的元素所在位置k
{
if(a[k]>a[j]) k=j;
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
} //交换a[i]和a[k]将当前最小值放到a[i]位置
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
2.冒泡排序
冒泡排序的思想:以n个人站队为例,从第1个开始,依次比较相邻的两个人是否逆序对(高在前矮在后),若逆序就交换这两人,即第1个和第2个比,若逆序,交换两人,接着第2个和第3个比,若逆序,交换两人,接着第3个和第4个比,若逆序,交换两人,……,直到n-1和n比较,经过一轮比较后,则把最高的人排到最后,即将最高的人像冒泡一样逐步冒到相应的位置。原n个人的排序问题,转换为n-1个人的排序问题。第二轮从第1个开始,依次比较相邻的两个人是否逆序对,若逆序就交换这两人,直到n-2和n-1比较。如此,进行n-1轮后,队列为有序的队列。
从上述分析中可以看出,每进行一轮的比较之后,n个数的排序规模就转化为了n-1个数的排序规模。
归纳上述分析,具体实现步骤如下:
(1)读人数据存放在a数组中。
(2)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将放的数组位置两个数据交换。
(3)对数组的第0个数据到n-1个数据进行一次遍历后,最大的一个数据就“冒”到数组第n-1个位置。
(4)n=n-1,如果n不为0就重复前面二步,否则排序完成。中选择最小的程序实现方法:用两层循环完成算法,外层循环i控制每轮要进行多次的比较,第一轮比较n-1次,第2轮比较n-2次,……,最后一轮比较1次。内层循环j控制每轮i次比较相邻两个元素是否逆序,若逆序就交换这有个元素。
代码
#include<bits/stdc++.h>
using namespace std;
int n,k,a[10005],temp; //定义变量
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=n-1;i>=1;i--)
{
for(int j=0;j<i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
3.插入排序
插入排序思想:回忆一下打牌时抓牌的情景,为了方便打牌,抓牌时一般一边抓牌一边按花色和大小插入恰当的位置,当抓完所有的牌时,手中的牌便是有序的。这种排序方法即插入排序。
当读入一个元素时,在已经排序好的序列中,搜寻它正确的位置,再放入读入的元素。但不该忽略一个重要的问题:在插入这个元素前,应当
先将它后面的所有元素后移一位,以保证前面处理过的元素不被覆盖。
归纳上述分析,具体实现步骤如下:
(1)读入数据存放在a数组中。
(2)从第2个数开始,取出当前数作为待排序数,逐个与前面的数比
较,若小于前面数,则前面数后移,当大等于前面数时,插入当前空出的
位置。
(3)直到第n个数插入正确位置为止。
程序实现方法:用两层循环完成算法,外层循环i控制待排序的数,
从第2个数到第n个数,内层循环j控制寻找插入的位置,j值从i-1开始向
前扫描,边扫描边将数据后移,寻找到位置,插入当前值。
代码
#include<bits/stdc++.h>
using namespace std;
int a[10005],n,temp,j;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
temp=a[i];j=i;
while (j>=1&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
for(int i=0;i<n;i++)
{
cout << a[i] << " ";
}
cout<<endl;
return 0;
}
请思考后在看代码哦!!!!!!!!
因博主是学生,代码难免有点小瑕疵,如果发现问题可以私信加作者微信或在评论区指出
文章制作不易,点个赞在走吧