比较排序:冒泡排序+插入排序+比较排序

以下排序都以从小到大排序为例

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

其实可以发现,以上三种排序方法运行过程输出都相同,尤其后两种,插入排序和选择排序思路很相似。

以上是比较排序中比较简单的三种排序方法

猜你喜欢

转载自blog.csdn.net/qq_40315080/article/details/82860364