简单排序分为三种:冒泡法、选择法、插入法
这三种排序方法是初学者学习c/c++都会学到的,是最基本的算法,下面就为大家介绍这三种算法
1、冒泡法
冒泡法又叫起泡法,其思想在于相邻两元素之间的两两交换,是算法中最入门的、最简单的一种算法,也是初学者必须要掌握的算法之一。
冒泡排序在最坏的情况下的比较次数是O(N^2) ,时间复杂度即为O(N^2),但其两两交换期间相同元素的前后顺序不会改变,所以这种算法具有稳定性。冒泡法按照最坏情况算外层循环从1到n要交换(n-1)次,内层循环要变换n次。冒泡法较宜理解,简单地说,就是让相邻的两个数依次去比大小,从1到n一直比较,经历n-1次比较,在进入下一个循环,最终比较出所有数的顺序。
基本思想:排序过程中相邻元素两两比较,若为逆序则交换,直到所有元素有序。
从小到大排序如下:
#include <iostream>
using namespace std;
int main()
{
int i,j,t,n;
int a[10000];
cin>>n; //输入要排序的数字个数
for(i=0;i<n;i++)
cin>>a[i]; //输入要排序的数
for(j=0;j<n-1;j++) //一共需比较n-1趟
{
for(i=0;i<n-j-1;i++) //每趟需进行n-j-1次的两两比较
{
if(a[i+1]<a[i]) //相邻的两个元素比较,如果前一个数比后一个数大,则交换这两个数的位置
{
t=a[i+1];
a[i+1]=a[i];
a[i]=t;
}
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" "; //输出排序结果
return 0;
}
2、选择法
选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。第一次需进行n-1次比较,第二次需进行n-2次比较,总共需要进行的比较次数是n(n-1)/2次比较,则时间复杂度为O(N^2),又因为元素的相对顺序发生改变,可以看出选择法是不稳定的。
基本思想:从当前待排序的记录中选取最小的元素记录下来,然后与排序的第一个元素进行交换,直到整个记录序列有序为止。
(1)先在这组元素中选取最小的元素;
(2)若它不是这组中的第一个元素,则让它与这组中的第一个元素交换;
(3)剩下的元素重复前两步直到所有元素有序。
从小到大排序如下:
#include <iostream>
using namespace std;
int main()
{
int i,j,n,k,t;
int a[10000];
cin>>n; //输入要排序的数字的个数
for(i=0;i<n;i++)
cin>>a[i]; //输入要排序的数
for(i=0;i<n-1;i++) //要做n-1趟选择
{
k=i; //k标记一开始的元素
for(j=i+1;j<n;j++)
if(a[k]>a[j])
k=j; //此时,a[k]表示的是最小的元素,k表示的是最小元素的下标
if(k!=i)
{
t=a[k];
a[k]=a[i];
a[i]=t; //第k个元素与第i个元素交换,最小的元素被排在最前面
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
3、插入法
插入排序法在最坏的情况下需要进行n(n-1)/2次比较,时间复杂度为O(N^2),但元素的相对顺序不改变,所以该算法具有稳定性。
基本思想:将整个要排序的数分为无序和有序的两个部分,然后将一个元素插入到长度为n-1的有序表中使之仍保持有序,得到一个长度为n的有序表中(初始的有序表中只有一个元素)。
该算法是每次从无序部分中取出第一个元素,把它插入到有序表的合适位置。第一趟比较前两个数,第二趟比较第三个数与前两个数的大小,并插入到适当的位置,依次进行下去,进行n-1趟之后完成排序。
从小到大排序如下:
#include <iostream>
using namespace std;
int main()
{
int i,j,n,t;
int a[10000]; //定义变量和数组
cin>>n; //输入要排序的数字的个数
for(i=0;i<n;i++)
cin>>a[i]; //输入要排序的数
for(i=1;i<n;i++)
{
t=a[i]; //记录当前元素
for(j=i;j>0&&t<a[j-1];j--) //比较元素并找到插入的位置
a[j]=a[j-1]; //将后面的元素依次后移
a[j]=t; //将当前元素插入到合适的位置
}
for(i=0;i<n;i++)
cout<<a[i]<<" "; //输出排序后的数
return 0;
}
以上即为本人对于三种排序方法的理解,欢迎大家指正!