三种简单排序介绍

简单排序分为三种:冒泡法、选择法、插入法

这三种排序方法是初学者学习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;
}

 

以上即为本人对于三种排序方法的理解,欢迎大家指正!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单排序是指冒泡排序选择排序和插入排序三种基本的排序。这些算都是通过比较和交换数组中的元素来实现排序的。以下是这三种简单介绍和Java代码实现: 1. 冒泡排序:重复地遍历要排序的数列,比较相邻的两个元素,如果顺序错误就交换它们的位置,直到没有需要交换的元素为止。时间复杂度为O(n^2)。 Java代码实现: ``` public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序:遍历数组,找到最小的元素,将其放到数组的起始位置,然后再从剩余的元素中找到最小的元素,放到已排序部分的末尾。时间复杂度为O(n^2)。 Java代码实现: ``` public static void selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } ``` 3. 插入排序:将数组分成已排序和未排序两部分,遍历未排序部分的元素,将其插入到已排序部分的合适位置。时间复杂度为O(n^2)。 Java代码实现: ``` public static void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值