算法的稳定性
稳定性是值当排序前,A在B前,如果排序后A还在B前,则算法稳定
冒泡排序
思想:从无序序列的起始位置,和下一位置的值进行俩俩比较
如果前一个对应的值比后一个值小,不动。如果前一个值比后一个值大,则交换位置
这样每一次都能筛选出,除了已经筛选序列中最大的,放到筛选好的队伍中
算法复杂度:每次对n元素递减 T(n) = O( n^2)
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)
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);
}
}
插入排序
插入排序个人理解更加像体育课排身高,需要以次的去比较高低大小,第一个人,他本身就第一位置前面没有人,所以第一位不需要比较。第二个人,我不能往后去站啊,因为后面有比我高的有低比我的,只能往前面的人去比较,第一个人如果比我低,我就可以不动了,如果比我高点,好咱俩交换位置。第三个人就要和前俩个人去进行比较,当我比第二个人高了,那就不用个第一个人比较了
算法复杂度:每次对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)
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;
}