三种排序

冒泡排序

给出一个序列a,其中元素个数为n,要求把他们按从小到大的顺序排序。

冒泡排序的本质在于交换,即每次通过比较交换的方式把当前带比较元素的最大值移动到一端,而当剩余的元素减少为0时,排序结束。

下面举个栗子。。

代码实现:

#include<cstdio>
int main(){
	int a[10]={3,1,4,5,2};
	for(int i=0;i<=5;i++){	//一共比较5趟 
		for(int j=0;j<4-i;j++){ //每一趟比较5-(i+1)次 
			if(a[j]>a[j+1]){  //如果前面的数比后面的数大,则向后挪 
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}  //每一趟比较都将这组中的最大数向后挪 
	}
	for(int i=0;i<5;i++){
		printf("%d\t",a[i]);
		
		
	}
} 

 

选择排序

简单选择排序,☞对一个序列A中的元素A[1]~A[n],令i从1到n枚举,进行n趟操作,每趟从待排序部分[i,n]中选择最小的元素,令其与带排序部分第一个元素A[i]进行交换,这样元素A[i]就会与当前有序区间[1,i-1]形成新的有序区间[i,1]。于是在n趟操作后,所有元素就会是有序的了。

  • 算法实现的逻辑:总共需要进行n趟操作(1=<i<=n),每趟操作选出待排序部分[i,n]中最小的元素,令其于A[i]交换。时间复杂度为O(n^2)。
  • 代码如下:
void selectSort(){
    for(int i=1;i<=n;i++){  //n趟操作
        int k=i; 
	for(int j=i;j<=n;j++){ //选出[i,n] 中最小的元素,下标为k 
            if(A[j]<A[k]){
		k=j;
	    } 
	} 
	int temp=A[i];
	A[i]=A[k];
	A[k]=temp;  
    }
}

插入排序

直接插入排序是指,对序列A的n个元素A[1]~A[n],令i从2到n枚举,进行n-1趟操作。

这个博文挺好的,收藏~https://blog.csdn.net/LLZK_/article/details/51628574 

以下转载自上面的博文~

插入排序原理很简单,将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。

为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。

下面以升序为例进行一次图解:

 

代码实现:

//直接插入排序
int A[maxn],n; //n为元素个数,数组下标为0~n-1
void insertSort(){
	for(int i=1;i<n;i++){  //进行n-1趟排序
		int temp=A[i],j=i;  //temp临时存放A[i],j从i开始往前枚举 
		while(j>1&&temp<A[j-1]){  //只要temp小于前一个元素A[j-1] 
			A[j]=A[j-1]; //把A[j-1]后移至A[j] 
			j--;
		}
		A[j]=temp; //插入位置为j 
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值