常见排序算法

常见排序算法

我们用到的排序有很多,这几种是我最常用到的吧,一下几种只是最基本的算法,但是具体使用时,还有一些以他们为基础的优化算法,几种算法结合使用等来减少算法的复杂度

冒泡排序:

每次外层循环中找出一个第i大的数,这其中是两两进行比较的,如果后一个数比前一个数大,便交换她们俩的位置

#include<iostream>
using namespace std;

int main(){
	int sort[8],i,j,k,temp;
	cout<<"请输入8个整数:"<<endl;   //endl表示回车换行
     
    for(int i = 0 ; i<8; i++){
    	cin>>sort[i];
	}
	
	for(int i = 0 ; i < 8 ; i++){
		for(int j = 0 ; j < 8-i ; j++){
			if(sort[j]>sort[j+1]){
				temp = sort[j];
				sort[j] = sort[j+1];
				sort[j+1] = temp;
			}
		}
	}
	
	cout<<"从小到大排序后的数组为:" <<endl;
	for(int i = 0 ; i<8 ; i++){
		cout<<sort[i]<<" ";
	}
	
    return k ;	 
} 

 

 

选择排序:

冒泡排序是一次循环找到一个第i大的数,但是循环式推进式进行的,两个比较之后还要进行交换,而选择排序只是记录下当前循环的最小值的下标(下面代码用i_min记录这个下标),当循环一次找出这个数的下标后,交换当前位置上的数与下标为i_min的书就行,比冒泡排序少了很多的交换操作。

#include<iostream>
using namespace std;

int main(){
	int sort[8],i_min,temp,k;
	cout<<"请输入8个数字:" <<endl;
	for(int i = 0 ; i< 8 ; i++){
		cin>>sort[i];
	}
	
	for(int i = 0 ; i < 7 ; i++){
		i_min = i ;                //i为当前循环的值,首先假设他是这次循环的最小值,i_min也记录他
		for(int j = i+1 ; j<8 ; j++){
			if(sort[j]<sort[i_min]){        //当发现更小的数时,i_min便记录这个更小数的下标
				i_min  = j; 
			}
		}
		if(i_min != i){                       //当发现i_min移动过后,便交换这两个数
		temp = sort[i_min];
		sort[i_min] = sort[i];
		sort[i] = temp;
	    }
	}
	
	cout<<"从小到大排序后的数字为:"<<endl;
	for(int i = 0 ; i < 8 ; i++){
		cout<<sort[i]<<" ";
	} 
	return k ; 
}

  

 

插入排序:

   思想比较的简单,大家都玩儿过扑克牌斗地主吧,如果你摸到一张7,很自然的就将这张牌插到了6和8之间

#include<iostream>
using namespace std;
int main(){ 
	    int j;               //当前的值的位置 
		int i;               //j的前一个位置 
		int key;             //当前进行插入排序的数值 
		int a[] = {1,4,3,6,2,10,5,9};
		for(j = 1 ; j < 8 ; j++){       //从第一个位置开始 
			key=a[j];
			i=j-1;
			while(i>=0 && a[i]>key){   //如果a[i]的值比key大的话,将a[i]后移,然后将这个位置空出来等待Key的插入
				a[i+1]=a[i];       //将a[i]后移 
				i--;   	
			}
			a[i+1]=key;                //将当前的值插入 
		}
		
		for(int i = 0 ;i < 8; i++){
			cout<<a[i]<<" ";
		}
	    
		return 1; 
	}

  

 

 桶排序:

基本思想,假如一次考试满分为10分,下面有N个同学的成绩需要排序,我们怎么用桶排序来解决这个问题呢:

首先我们设想有a[0]到a[10]一共11个桶分别代表0到10分,a这个数组的初始值都是0(a[i]的值表示成绩为i的学生有多少个),假如一个同学的成绩为8分便将a[8]++,这样便将同学的成绩有序的存储起来了,到时再有序的都出来便可。

#include<iostream>
using namespace std;
int main(){ 
  int a[] = {0,0,0,0,0,0,0,0,0,0,0};    //代表装成绩的水桶。。。 这里的0代表拥有这个成绩的学生的个数 
  int temp;
  cout<<"请输入8个学生的成绩" <<endl;
  for(int i = 0 ; i < 8 ; i++){//下面循环读入8个学生的成绩 
    cin>>temp;
    a[temp]++;
  }
  
  for(int i = 0 ;i < 11;i++){        //输出排序后的值 
    for(int j = a[i] ; j>0; j--)
  	cout<<i<<" "; 
  }
  
  return 1; 
} 

  

posted @ 2016-04-25 10:42  HCherish  阅读(123)  评论(0)    收藏  举报