排序

算法的稳定性

稳定性是值当排序前,A在B前,如果排序后A还在B前,则算法稳定

冒泡排序

思想:从无序序列的起始位置,和下一位置的值进行俩俩比较

如果前一个对应的值比后一个值小,不动。如果前一个值比后一个值大,则交换位置

这样每一次都能筛选出,除了已经筛选序列中最大的,放到筛选好的队伍中

算法复杂度:每次对n元素递减 T(n) = O( n^2)

img

int main(){
	for(int i=0;i<9-1;i++)
		for(int j=0;j<9-1-i;j++)
			if(arr[j]>arr[j+1])
			{
				int tmp = arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
    return 0;
} 

选择排序

选择排序就是在序列A中首选寻找出最大的元素(或者最小的元素)放在一个位置上,从而找到一个序列的最大的数,剩下的元素以此类推,找到第二大的元素,第三大的元素

算法复杂度:每次对n元素递减 T(n) = O( n^2)

img

void swap(int n, int m){
	int tmp = lst[n];
	lst[n]=lst[m];
	lst[m]=tmp;
}
void sort(int len){
	for(int i=0;i<len;i++){
		int n =i;
		for(int j=i+1;j<len;j++){
			if(lst[n]>lst[j])
				n=j;
		}
		if(n !=i) // 判断当前i的位置是不是最大的,是就不用交换了
			swap(i,n);
	} 
}

插入排序

img

插入排序个人理解更加像体育课排身高,需要以次的去比较高低大小,第一个人,他本身就第一位置前面没有人,所以第一位不需要比较。第二个人,我不能往后去站啊,因为后面有比我高的有低比我的,只能往前面的人去比较,第一个人如果比我低,我就可以不动了,如果比我高点,好咱俩交换位置。第三个人就要和前俩个人去进行比较,当我比第二个人高了,那就不用个第一个人比较了

算法复杂度:每次对n元素递减 T(n) = O( n^2)

// 递归版本
void sort(int len){
    	if(len == 0)return;
    	sort(len-1);
     
    	int tmp = arr[len];
    	while(len>0 && tmp < arr[len-1]){
    		arr[len]=arr[len-1];
    		len--;
    	}
    arr[len]=tmp;
}

// 非递归版本,for + while
int main(){
	for(int i=1;i<9;i++){
		int tmp=arr[i];
		int n = i;
		while(n>0 && tmp<arr[n-1]){
			arr[n]=arr[n-1];
			n--; }
		arr[n]=tmp;
	}
	return 0;
} 

希尔排序

了解了插入排序后,插入排序比较的进位是单位1,而希尔排序就是在插入的基础进位为 序列长度的一半,每次递归进位是上层进位的一半 ,有 8个元素的序列进位是 4 2 1

算法复杂度:T(n) = n*logn 或者 O( n^2)

img

void sort(int mode,int right){
    	if(mode == 0)return;
		for(int i=mode;i<right;i++){
			int tmp=lst[i];
			int n = i;
			while(n>0 && tmp<lst[n-mode]){
				lst[n]=lst[n-mode];
				n-=mode;
			}
			lst[n]=tmp;
		}
	sort(mode/2,right);
}
int main(){
	sort(9/2,9);
	return 0;
}  

全排列

比如 123 有六种方式:123 132 213 231 312 321 这就是全排列

void swap(int n, int m){
	int tmp=arr[n];
	arr[n] = arr[m] ;
	arr[m] = tmp;
}
void p(int position, int len){
	if(position == len){//当positon等于了len就是排到最后一个数了,之下来已经没有数再去排了
		for(int i=0;i<len;i++)
			cout<<arr[i]<<" ";
		cout<<endl;
      }
	else{
		for(int i=position;i<len;i++)
		{
			swap(i,position);
   // 交换元素,达到循环渐进的效果,比如 123  213
			p(position+1,len);
			swap(position,i);
   // 交换完毕后,要把元素归位 让下个元素和它下个元素交换
		}
	}	
} 

使用c++的库函数 algorithm vector

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int arr[]={1,2,3,4};

int main(){
    	vector<int> lst; // 创建 int 类型的集合 vector
	for(int i=0;i<4;i++)
		lst.push_back(arr[i]);  // 把序列中元素加入vector集合 叫做压缩
	do{
		for(int i=0;i<4;i++)
			cout<<lst[i]<<" ";
		cout<<endl;
	}while(next_permutation(lst.begin(),lst.end()));
 // next_permutation 是全排序函数 存在于算法包中 algorithm 
 // 用法是 do----while
 // 参数是 对于集合或者字符串string 类型 起始位置 begin 终至位置 end
	return 0;
}
posted @ 2020-03-30 15:44  余生请你指教  阅读(82)  评论(0编辑  收藏  举报