八大排序算法c++
1.冒泡排序
大部分人的第一个排序,想想以前我上c的时候,觉得一个冒泡排序难的和鬼一样,现在。。。
思想:每一趟将最大的固定在最后面;
void bubble_sort(int a[],int n){ int i,j; for(i=0;i<n-1;i++){//只有一个的时候不用比较所以<n-1 for(j=0;j<n-i-1;j++){ if(a[j]>a[j+1])swap(a[j],a[j+1]);//用的是c++里面的#include<algorithm.h>头文件的方法 } } }
2.选择排序
思想:当前的i位置,在从[i,n]之中找一个最小值的位置然后交换;
void select_sort(int a[],int n){ int i,j,index; for(i=0;i<n-1;i++){ index=i; for(j=i+1;j<n;j++)if(a[index]>a[j])index=j; swap(a[index],a[i]); } }
3.插入排序
思想:i为当前带比较的值,将i插入到[i,n]中合适的位置;
void insert_sort(int a[],int n){ int i,j,key; for(i=0;i<n;i++){ key=a[i],j=i-1; while(j>=0&&a[j]>key)a[j+1]=a[j--]; a[j+1]=key; } }
4.归并排序
思想:左右两边有序,合并为一个有序;
知道将两个有序的数组合并为一个,就ok
void merge_sort(int a[],int s,int e){ if(s>=e)return; int mid=(s+e)/2; merge_sort(a,s,mid); merge_sort(a,mid+1,e); int i,j,k,temp[N];//定义了一个临时结果数组 i=s,j=mid+1,k=s; while(i<=mid&&j<=e){ if(a[i]<a[j])temp[k++]=a[i++]; else temp[k++]=a[j++]; } if(i<=mid)while(i<=mid)temp[k++]=a[i++]; if(j<=e)while(j<=e)temp[k++]=a[j++]; for(i=s;i<=e;i++)a[i]=temp[i]; }
5.快速排序
思想:以第一个数值为关键值,先从后面找一个比关键值小的交换,再从前面找一个比关键值大的交换,直到i==j再两边快排;
void quick_sort(int a[],int s,int e){ if(s>=e)return; int i,j,key,mid; key=a[s],i=s,j=e; while(i<j){ while(i<j&&a[j]>key)j--; if(i<j)a[i++]=a[j]; while(i<j&&a[i]<key)i++; if(i<j)a[j--]=a[i]; } a[i]=key; quick_sort(a,s,i); quick_sort(a,i+1,e); }
6.堆排序
思想:1.构造一个大顶堆 2.将根节点和最后一个叶子节点交换 3.对堆进行调整为大顶堆
void heap_adjust(int a[],int s,int e){ int i,key; key=a[s]; for(i=2*s+1;i<=e;i=i*2+1){//遍历s根的,左右节点,找出最大的值和s交换 if(i<e&&a[i]<a[i+1])i++; if(a[i]<key)break; a[s]=a[i]; s=i; } a[s]=key; }//堆的调整 void heap_sort(int a[],int n){ int i; for(i=n/2-1;i>=0;i--)heap_adjust(a,i,n-1);//首先将a[]构成一个大顶堆;heap_adjust要求比较的子树都是大顶堆,所以从最后的根节点向前进行; for(i=n-1;i>0;i--){ swap(a[0],a[i]); heap_adjust(a,0,i-1); } }
7.希尔排序
思想:缩小增量排序,按着d对a[]进行插入排序,缩小d的值
void shell_insert(int a[],int n,int d){ int i,j,key; for(i=0;i<n;i++){ j=i-d; key=a[i]; while(j>=0&&a[j]>key){ a[j+d]=a[j]; j-=d; } a[j+d]=key; } }
void shell_sort(int a[],int n){ int d=n/2; while(d){ shell_insert(a,n,d); d/=2; } }
8.基数排序
1.找到最长的位数 2.求各位数的数次数放入bucket[],将数放入output[] 3.从前向后收集数组的值入a[]
void distrubution(int a[],int n,int bucket[],int k){ int i; for(i=0;i<n;i++)bucket[(a[i]/k)%10]++; for(i=1;i<n;i++)bucket[i]+=bucket[i-1]; } void collection(int a[],int n,int bucket[],int k){ int i,t[N]; for(i=n-1;i>=0;i--){ t[bucket[(a[i]/k)%10]-1]=a[i]; bucket[(a[i]/k)%10]--; } for(i=0;i<n;i++)a[i]=t[i]; } void radix_sort(int a[],int n){ int maxnum,i,j,num; int bucket[N]; maxnum=0; for(i=0;i<n;i++){ num=a[i],j=0; while(num)num/=10,j++; if(maxnum<j)maxnum=j; } for(i=0;i<maxnum;i++){ memset(bucket,0,sizeof(bucket)); distrubution(a,n,bucket,pow(10,i)); collection(a,n,bucket,pow(10,i)); } }
stay hungry stay foolish

浙公网安备 33010602011771号