排序专题

这篇文章我们不讲题,而是专门讲一个专题

排序!!!

这讲排序呢,我们主要讲一下冒泡排序,插入排序与最为简洁的快排

1、冒泡排序

大家喝碳酸饮料的时候,会发现杯底的泡泡一个个升起来(然后爆掉),由此,人们想到了冒泡排序(官方说法???

所以,冒泡排序的大概思想就是一遍遍的过滤,讲更小的数(或更大的)一个个让它“冒”到前面去

#include<iostream>
#include<cmath>
using namespace std;
int a[100001];
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=n;i>1;i--){
        for(int j=1;j<i;j++){
            if(a[j]>a[j+1])
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
        }
    }
    return 0;
}

这是一个升序的冒泡排序,降序的改一下符号就可以了

2、插入排序

既然上一个排序有那么奇葩的起源,那这个排序有没有呢(滑稽),其实,确实是有的,据说这个排序是从扑克牌中获得的灵感

打扑克牌的时候一般都会将牌有序的拿好,这就很像一个插入排序的过程

插入排序,就是每输入一个数,就在原有的数中找到它的位置,输入完了,也就排完了,不过复杂度仍不容乐观,与冒泡排序一样,都是O(n^2)

#include<iostream>
using namespace std;
int a[100001],n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		int t=a[i];
		for(int j=1;j<i;j++){
			if(a[i]<=a[j]){
				for(int k=i-1;k>=j;k--)
					a[k+1]=a[k];
				a[j]=t;
				break;
			}
		}
	}
		for(int i=1;i<=n;i++)
			cout<<a[i]<<' ';
		return 0;
}

3、快排

快排我这里只会讲STL模板的用法,具体的代码不会在这里讲解,只会把代码粘上来

快排默认升序,所以想要降序要写函数

//升序快排
#include<iostream>
#include<algorithm>//sort的函数库
using namespace std;
int n,a[100001];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);//表示a[1]到a[n]升序
    return 0;
}
//降序附加
/*
inline int cmp(int x,int y){
    return x>y;
}
*/
//sort(a+1,a+n+1,cmp);

附录:

#include<bits/stdc++.h> 
#include<iostream>
using namespace std;
int randomInRange(int start, int end){
	return rand()%(end - start + 1) + start;
}

int Partition(int data[],int length,int start,int end){
	if(data==NULL||length<=0||start<0||end>length)
		throw new std::exception();
	int index=randomInRange(start,end);
//	int index=end;
	swap(data[index],data[end]);
	
	int small=start-1;
	for(index=start;index<=end;index++){
		if(data[index]<data[end]){
			small++;
			if(small!=index)
				swap(data[index],data[small]);
		}
	}
	
	small++;
	swap(data[small],data[end]);
	
	return small;
}

void QuickSort(int data[],int length,int start,int end){
	if(start==end)	
		return ;
		
	int index=Partition(data,length,start,end);
	if(index>start)
		QuickSort(data,length,start,index-1);
	if(index<end)
	    QuickSort(data,length,index+1,end);
}

int main(){   
    int length; 
	scanf("%d",&length);   
	if(length<=0){
		return 0;
	}else{
	int a[length];
	for(int i=0;i<=length-1;i++)
	    scanf("%d",&a[i]); 
	QuickSort(a,length,0,length-1);
	for(int i=0;i<=length-1;i++)
    	printf("%d ",a[i]);
	return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42739663/article/details/81168824
今日推荐