冒泡排序、插入排序、选择排序及其实现

开始复习基本算法了,今天下午看了三个排序算法,都是入门级别的。

一、冒泡排序

1、思想:有两层循环,当前的位置如果到了i(第一层循环),那么就从i+1到n中开始遍历(第二层循环),为的是在i到n中找到最小的,放置在当前的位置上,与选择排序的不同是,选择排序是在第二层循环之后,将保存的最小位置与i交换,而冒泡排序中数组[i]的值一直在变,所以才叫冒泡

2、时间复杂度:最坏时间复杂度为O(n^2)

3、实现代码:

#include <iostream>
using namespace std;
int main(){
	int n = 0;
	int a[101];
	while(scanf("%d",&n)!=EOF){
		for(int i =0;i<n;i++){
		cin>>a[i];
	}
	for(int i = 0;i<n;i++){
		for(int j = i+1;j<n;j++){
			if(a[j]<a[i]){
				int c = a[i];
				a[i]=a[j];
				a[j]=c;
			}
		}
	}
	for(int i =0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	}
	
	return 0;
} 

二、选择排序

1、原理:与冒泡排血的不同点为:在第一层循环里设置一个最小值量,并在第二层中选择到最小值所在下座标赋予,最后交换位置

2、时间复杂度:O(N^2)

3、源代码:

#include <iostream>
using namespace std;
int a[101];
int main(){
	int n = 0;
	cin>>n;	
	for(int i = 0;i<n;i++){
		cin>>a[i];
	}
	for(int i =0;i<n;i++){
		int flag = i;
		for(int j = i+1;j<n;j++){
			if(a[j]<a[flag]){
				flag = j;
			}
		}
		int c = a[i];
		a[i] = a[flag];
		a[flag] = c;
	}
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

三、插入排序

1、原理:循环到数组某个元素i时,向前面遍历(第二层循环),前面已经排好序了,因此一个一个向前换,直到到达排好序的位置后插入。

2、时间复杂度:O(N^2)

3、源代码:

#include <iostream>
using namespace std;
int a[101];
int main(){
	int n = 0;
	cin>>n;	
	for(int i = 0;i<n;i++){
		cin>>a[i];
	}
	for(int i =1;i<n;i++){
		for(int j = i;j>0;j--){
			if(a[j]<a[j-1]){
				int c = a[j-1];
				a[j-1]=a[j];
				a[j]=c;
			}
		}
	}
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

点赞