以下排序都以从小到大排序为例
1.冒泡排序:
冒泡排序就是从第一个元素开始,对每一个元素与它之后所有的元素进行比较,将较小的一个放在前,大的放在后
冒泡排序两层循环(一般排序都是两层循环),内层循环有两种写法,形式稍稍不同,但排序结果相同:
第一种
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
int tem=a[i];a[i]=a[j];a[j]=tem;
}
}
//for(int j=0;j<n;j++)cout<<a[j]<<" ";
//cout<<endl;
}
这里内层循环j从i+1开始,j++,从前向后遍历,上面注释掉的部分是用来看每排完一轮的排序结果,举例一组运行结果:
输入的n=10,数组a:1, 23, 45, 2, 55, 7, 9, 10, 12, 40
每一轮排序结果:
1 23 45 2 55 7 9 10 12 40
1 2 45 23 55 7 9 10 12 40
1 2 7 45 55 23 9 10 12 40
1 2 7 9 55 45 23 10 12 40
1 2 7 9 10 55 45 23 12 40
1 2 7 9 10 12 55 45 23 40
1 2 7 9 10 12 23 55 45 40
1 2 7 9 10 12 23 40 55 45
1 2 7 9 10 12 23 40 45 55
最终结果:
1 2 7 9 10 12 23 40 45 55
可以看到每一轮排完,都可以确定一个当前剩余元素中的最小数将它放在对应的位置,直到最后一轮排完最后一个元素
第二种
for(int i=0;i<n-1;i++)
{
for(int j=n-1;j>i;j--)
{
if(a[i]>a[j])
{
int tem=a[i];a[i]=a[j];a[j]=tem;
}
}
for(int j=0;j<n;j++)cout<<a[j]<<" ";
cout<<endl;
}
内层循环j从n-1开始,j–,直到i+1,从后向前遍历
同样输入的n=10,数组a:1, 23, 45, 2, 55, 7, 9, 10, 12, 40
每一轮排序结果:
1 23 45 2 55 7 9 10 12 40
1 2 45 23 55 7 9 10 12 40
1 2 7 45 55 23 9 10 12 40
1 2 7 9 55 45 23 10 12 40
1 2 7 9 10 55 45 23 12 40
1 2 7 9 10 12 55 45 23 40
1 2 7 9 10 12 23 55 45 40
1 2 7 9 10 12 23 40 55 45
1 2 7 9 10 12 23 40 45 55
最终结果:
1 2 7 9 10 12 23 40 45 55
两种写法无论过程还是结果都一模一样
2.插入排序:
就是遍历每个元素,对每个元素实现这个元素之前所有元素由大到小排列,为什么叫插入排序呢?这种排序就像先排好一段的顺序后再加入元素,再排序,不断重复直到排完所有的元素。【我认为和递归很像,例如刚开始i=1,从第二个元素开始,向前排序,小的在前,大的在后,这样排好了2个,对第3个元素,向前遇到更小的就交换顺序,这样就排好了3个,以此类推,就可以排好所有的元素】
for(int i=1;i<n;i++)
{
int tem=a[i];int j;
for(j=i;j>0&&tem<a[j-1];j--)
a[j]=a[j-1];
a[j]=tem;
//for(int j=0;j<n;j++)cout<<a[j]<<" ";
//cout<<endl;
}
看一下注释行显示的运行结果
输入n=10,数组a:1, 23, 45, 2, 55, 7, 9, 10, 12, 40
运行过程:
1 23 45 2 55 7 9 10 12 40
1 2 23 45 55 7 9 10 12 40
1 2 23 45 55 7 9 10 12 40
1 2 7 23 45 55 9 10 12 40
1 2 7 9 23 45 55 10 12 40
1 2 7 9 10 23 45 55 12 40
1 2 7 9 10 12 23 45 55 40
1 2 7 9 10 12 23 40 45 55
最终结果:
1 2 7 9 10 12 23 40 45 55
每排一轮可以发现有序的序列元素个数+1
3.选择排序:
这个排序理解比较简单,就是不断寻找剩余元素中最小的元素,把它排在前面
for(int i=0;i<n;i++)
{
int tem=a[i];int k=i;
for(int j=i;j<n;j++)
{
if(a[j]<tem)
{
tem=a[j];
k=j;
}
}
a[k]=a[i];
a[i]=tem;
//for(int j=0;j<n;j++)cout<<a[j]<<" ";
//cout<<endl;
}
输入n=10
运行过程:
1 23 45 2 55 7 9 10 12 40
1 2 45 23 55 7 9 10 12 40
1 2 7 23 55 45 9 10 12 40
1 2 7 9 55 45 23 10 12 40
1 2 7 9 10 45 23 55 12 40
1 2 7 9 10 12 23 55 45 40
1 2 7 9 10 12 23 55 45 40
1 2 7 9 10 12 23 40 45 55
1 2 7 9 10 12 23 40 45 55
1 2 7 9 10 12 23 40 45 55
最终结果:
1 2 7 9 10 12 23 40 45 55
其实可以发现,以上三种排序方法运行过程输出都相同,尤其后两种,插入排序和选择排序思路很相似。
以上是比较排序中比较简单的三种排序方法