常见排序算法
常见排序算法
我们用到的排序有很多,这几种是我最常用到的吧,一下几种只是最基本的算法,但是具体使用时,还有一些以他们为基础的优化算法,几种算法结合使用等来减少算法的复杂度
冒泡排序:
每次外层循环中找出一个第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;
}
浙公网安备 33010602011771号