几种排序算法的总结
来源:互联网 发布:游戏数据加密算法 编辑:程序博客网 时间:2024/06/07 20:00
1.插入排序
可以联想成打扑克时手里拿牌的一个过程,手里的牌总是有序的,摸的牌依次比较,放入正确的位置。
#include<iostream>#include<vector>using namespace std;void insertsort(vector<int> &arr){ for(int i=1;i<arr.size();i++)//i与之前的进行比较 { int j=i-1; int temp=arr[i]; while(j>=0 && arr[j]>arr[i] ) { arr[j+1]=arr[j]; j--; } arr[j+1]=temp; }}int main(){ vector<int> arr; arr.push_back(2); arr.push_back(1); arr.push_back(4); arr.push_back(3); arr.push_back(7); arr.push_back(6); insertsort(arr); for(int i=0;i<arr.size();i++) { cout<<arr[i]<<endl; }}
2.归并排序
联想成桌面有两组牌,依旧比较牌面最上面的牌最小的排好序。
void merge(vector<int> &arr,int p,int q,int r){ vector<int> L; vector<int> R; for(int i=p;i<=q;i++) { L.push_back(arr[i]); }; L.push_back(INT_MAX); for(int i=q+1;i<=r;i++) { R.push_back(arr[i]); } int i=0,j=0; R.push_back(INT_MAX); for(int k=p;k<=r;k++) { if(L[i]<=R[j]) { arr[k]=L[i]; i++; } else if(R[j]<=L[i]) { arr[k]=R[j]; j++; } }}void mergesort(vector<int> &arr,int p, int r){ if (p<r) { int q = (p+r)/2; mergesort(arr, p, q); mergesort(arr, q+1, r); merge(arr, p, q, r); } }
3.快速排序
快排主要在于一趟快排的过,即从后向前依次寻找比x小的数,找到了交换,同时i增加。使得x的左边小于x,右边大于x。
int partition(vector<int> &A,int p,int r){ int i=p-1; int x=A[r]; for(int j=p;j<r;j++) { if(A[j]<x) { i++; swap(A[i],A[j]); } } swap(A[i+1],A[r]); return i+1;}void quicksort(vector<int> &A,int p,int r){ if(p<r) { int q=partition(A,p,r); quicksort(A,p,q-1); quicksort(A,q+1,r); }}
4.堆排序
建立最大堆,联想建立堆首先要想到维护堆的过程,维护堆则需要比较节点i的左右孩子是否大于i,如果大于则交换,同时继续向下维护。
建立堆则是除去叶子节点,对其他节点依次进行维护。
现在堆顶元素是最大的元素,交换堆顶与arr[n],堆的大小减1,则去掉堆顶,最剩余元素进行维护。
void heapify(vector<int> &arr,int heap_size,int i){ int left=2*i+1; int right=2*i+2; int largest; if(left<heap_size &&arr[left]>arr[i]) largest=left; else largest=i; if(right<heap_size &&arr[right]>arr[largest]) largest=right; if(largest!=i) { swap(arr[i],arr[largest]); heapify(arr,heap_size,largest); }}void build_heap(vector<int> &arr){ //除去叶子节点,进行维护 for(int i=(arr.size()-1)/2;i>=0;i--) heapify(arr,arr.size(),i);}void heap_sort(vector<int> &arr){ //先建堆 build_heap(arr); int heap_size=arr.size(); //再维护,A[0]现在是最大的元素,与A[i]交换,再维护 for(int i=arr.size()-1;i>0;i--) { swap(arr[0],arr[i]); heap_size=heap_size-1; heapify(arr,heap_size,0); }}
5.选择排序
这个比较简单,其实就是依次比较出最小的数。
void SelectionSort(vector<int> &arr){ for(int i=0;i<arr.size();i++) for(int j=i+1;j<arr.size();j++) { if(arr[j]<arr[i]) swap(arr[j],arr[i]); }}
6.冒泡排序
联想鱼吐泡泡的样子,大的泡泡总是在上面,所以需要将相邻的两个数进行比较,将后面的较大数先比较出来
void BubbleSort(vector<int> &arr){ for(int i=0;i<arr.size();i++) for(int j=0;j<arr.size()-i-1;j++) { if(arr[j]>arr[j+1]) { swap(arr[j],arr[j+1]); } }}
7.计数排序
联想哈希表,计数排序从名字上记忆就是比x小的有m个,则x应该在m位(数组从0开始)
vector<int> CountingSort(vector<int> arr,int k)//k是arr数组元素的范围,0-k{ int len=arr.size(); vector<int> temp(k+1,0); vector<int> res(len,0); for(int i=0;i<len;i++) { temp[arr[i]]=temp[arr[i]]+1; } for(int i=1;i<=k;i++) { temp[i]=temp[i-1]+temp[i]; } for(int i=len-1;i>=0;i--) { res[temp[arr[i]]-1]=arr[i]; temp[arr[i]]=temp[arr[i]]-1; } return res;}
8.基数排序
阅读全文
0 0
- 几种经典排序算法的总结
- 几种排序算法的总结
- 几种排序算法的总结
- 几种常用的排序算法总结
- 几种排序算法的简单总结
- 几种常用的排序算法总结
- 常见的几种排序算法总结
- 几种排序算法的总结
- 几种排序算法总结
- 几种排序算法总结
- 几种排序算法总结:
- 几种排序算法总结
- 几种排序算法总结
- 几种排序算法总结
- 总结几种排序算法
- 总结几种排序算法的Java实现
- 总结几种常用的排序算法(含代码)
- 几种排序算法的稳定性判断与总结
- 漫步最优化十九——封闭算法
- 关注民生民情——华北水利水电大学“情艺”国情社情调查
- 【BZOJ3555】【Ctsc2014】企鹅QQ
- 算法编程之顺序表头插法
- MQTT协议(推送)学习
- 几种排序算法的总结
- UVALive 7264 Kejin Game (最大流最小割)
- 山东省第八届 ACM 省赛 quadratic equation
- POJ 3186 Treat for the Cows(区间dp)
- Unity UI模块优化(2.优化渲染开销)
- 【牛腩】“/”应用程序中的服务器错误
- viterbi算法 结合中文分词
- Android消息驱动模式
- 统计同成绩学生人数