这三种排序可以作为是算法入门的基础,三者的时间复杂度都是o(n^2),建议初学者试着独自实现这些算法,下面的OJ题可以测试你的算法是否是正确的:排序测试。以下所有的代码均通过该测试
冒泡排序
这个是在初学C语言时就接触的算法,思路就是遍历整个序列,依次比较两个相邻元素之间的大小,根据大小关系再决定是否调换,至多经过n次遍历即可得到一个有序序列。
#include<iostream>
using namespace std;
/*冒泡排序从第一个元素开始,依次将相邻元素比较,若满足条件,则位置不变,若不满足则交换位置,直到整个序列有序*/
int array[100];
void Show(int *array,int Tcase); //输出当前数组内的元素
bool comp(int a,int b); //判断标准
bool Adjust(int *array,int Tcase,bool(*comp)(int a,int b)); //对该数组进行一趟冒泡排序
//的调整,如果中途没有发生交换,返回true否则返回false
int main(){
int i,Tcase;
cin>>Tcase; //先输入测试的数据个数
for(i=0;i<Tcase;++i) {
cin>>array[i]; //依次输入当前的值
}
i=1;
while(Adjust(array,Tcase,comp)==0){
}
Show(array,Tcase);
return 0;
}
void Show(int *array,int Tcase){
//输出当前数组内的元素
int i;
for(i=0;i<Tcase;++i) {
cout<<array[i]<<" ";
}
}
bool Adjust(int *array,int Tcase,bool(*comp)(int a,int b)){
int i,temp,flag=1;
for(i=0;i<Tcase-1;++i){
if(comp(array[i],array[i+1])){
temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
flag=0;
}
}
if(flag==1){
return true;
}
else{
return false;
}
}
bool comp(int a,int b){
return a>b;
}
选择排序
初始的序列可以分为两个集合,有序序列和无序序列,其中初始有序序列为空集。在初始的无序序列中,选择当前最大(最小)的元素,加入有序序列的末尾中,直到有序序列为空为止。
/*
Name:
Description: 选择排序
*/
#include<iostream>
using namespace std;
void swap(int a[],int m,int n); //交换数组a中下标为a和b的值
void Selectsort(int a[],int start,int end); //对数组a中的下标a[start]到a[end]进行选择排序
int FindTarget(int a[],int start,int end); //找到数组start到end之中满足条件的极值的下标
bool comp(int a,int b) {
return a>b;
}
int main() {
int N;
cin>>N;
int a[N];
for(int i=0; i<N; ++i) {
cin>>a[i];
}
Selectsort(a,0,N-1);
for(int i=0; i<N; ++i) {
cout<<a[i]<<" ";
}
return 0;
}
void Selectsort(int a[],int start,int end){
for(int i=start;i<=end;i++){
int T=FindTarget(a,i,end);
swap(a,i,T);
}
}
void swap(int a[],int m,int n){
int temp=a[m];
a[m]=a[n];
a[n]=temp;
}
int FindTarget(int a[],int start,int end){
int T=start;
for(int i=start;i<=end;++i) {
if(comp(a[T],a[i])){
T=i;
}
}
return T;
}
插入排序
和选择排序类似,可以将序列初始分为有序的空集和无序的全集。不同的是,我们顺序取得无序集的元素,然后在有序集中,找到它所在的位置,然后将所选元素插入其位置。
#include<iostream>
using namespace std;
/*插入排序从第i个元素开始,然后在前i-1个位置中,找到合适的地方后插,直到整个序列有序*/
int array[100];
void Show(int *array,int Tcase); //输出当前数组内的元素
bool comp(int a,int b); //判断标准
void Adjust(int *array,int Tcase,int i,bool(*comp)(int a,int b)); //对该数组的第i个元素进
//行一趟选择排序的操作
int main() {
int i,Tcase;
cin>>Tcase; //先输入测试的数据个数
for(i=0; i<Tcase; ++i) {
cin>>array[i]; //依次输入当前的值
}
for(i=0; i<Tcase; ++i) {
Adjust(array,Tcase,i,comp);
// printf("第%d躺排序: ",i+1);
}
Show(array,Tcase);
return 0;
}
void Show(int *array,int Tcase) {
//输出当前数组内的元素
int i;
for(i=0; i<Tcase; ++i) {
cout<<array[i]<<" ";
}
}
void Adjust(int *array,int Tcase,int i,bool(*comp)(int a,int b)) {
int temp=array[i];
int k,j;
for(k=0; k<i; ++k) {
if(comp(array[i],array[k])) {
for(j=i-1; j>=k; --j) { //将k位置之后的元素全部右移
array[j+1]=array[j];
}
array[k]=temp;
return;
}
/* if(k==0){
for(j=i-1;j>=0;--j){ //将k位置之后的元素全部右移
array[j+1]=array[j];
}
array[k]=temp;
return;
} */
}
}
bool comp(int a,int b) {
if(a<b) {
return true;
} else {
return false;
}
}