排序算法总结
来源:互联网 发布:java 代码生成框架 编辑:程序博客网 时间:2024/04/29 18:33
最近马上就要校招了,开始进入刷题模式,做了一些题后发现,排序算法实际上是好多题目的基础,掌握好各种排序算法对处理各种复杂题目是十分有帮助的。
好了,话不多说,概念大家都懂,我直接上代码,以下代码我全部手敲了一遍,建议大家也自己敲一遍,再比较一下各种算法的异同。
先列个表总结一下:
冒泡排序:
#include <iostream>using namespace std;void swap(int *a, int *b){ int c; c = *a; *a = *b; *b = c;}int main(){ int num[10]; int i,j; //初始化数组为10 9 8 7 6 5 4 3 2 1 for (i = 0; i < 10; i++){ num[i] = 10 - i; } //排序,从a[0]开始排,从小到大 for (i = 0; i < 10; i++){ for (j = i + 1; j < 10; j++){ if (num[i] > num[j]){ swap(&num[i], &num[j]); } } } for (i = 0; i < 10; i++) cout<<num[i]<<endl; return 0;}
堆排序:
#include <iostream>#include <algorithm>using namespace std;void HeapAdjust(int *a,int i,int size) //调整堆{ int lchild=2*i; //i的左孩子节点序号 int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } }}void swap(int* a,int* b){ int* temp; temp=a; a=b; b=temp;}void BuildHeap(int *a,int size) //建立堆{ int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); }}void HeapSort(int *a,int size) //堆排序{ int i; BuildHeap(a,size); for(i=size;i>=1;i--) { //cout<<a[1]<<" "; swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 //BuildHeap(a,i-1); //将余下元素重新建立为大顶堆 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 }}int main(int argc, char *argv[]){ //int a[]={0,16,20,3,11,17,8}; int a[100]; int size; cin>>size; if(size>0) { int i; for(i=1;i<=size;i++) cin>>a[i]; HeapSort(a,size); for(i=1;i<=size;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}插入排序:
#include<iostream>#include<algorithm>using namespace std;void insertsort(int* a,int size){ int key; int i,j; for(j=2;j<=size;j++){ i=j-1; key=a[j]; while(i>0&&a[i]>key){ a[j]=a[i]; i=i-1; } a[i+1]=key; }}int main(int argc,char* argv[]){ int a[100]; int size; cin>>size; if(size>0) { int i; for(i=1;i<=size;i++) cin>>a[i]; insertsort(a,size); for(i=1;i<=size;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}快速排序:
#include<iostream>using namespace std;/* Quick Sort */void swap(int& a,int& b){ int temp; temp = a; a = b; b = temp;}int partition(int* a,int p,int q){ int i = p-1; int j; for(j=p;j<q;j++){ if(a[j]<=a[q]){ i++; swap(a[i],a[j]); } } swap(a[i+1],a[q]); return i+1;}void quicksort(int* a,int p,int q){ int r; if(p<q){ r = partition(a,p,q); quicksort(a,p,r-1); quicksort(a,r+1,q); }}int main(){ int array[100]; int size; int i; cout<<"please input the size:"<<endl; cin>>size; cout<<"please input the array:"<<endl; for(i=0;i<size;i++) cin>>array[i]; quicksort(array,0,size-1); cout<<"sorted array:"<<endl; for(i=0;i<size;i++) cout<<array[i]<<" "; return 0;}归并排序:
#include<iostream>using namespace std;#define MAX_NUM 99999#define Length 10void Merge(int* arr,int p,int q,int r){ int n1 = q - p + 1; int n2 = r - q; int i,j,k; int* tmp1 = new int[n1+1]; int* tmp2 = new int[n2+1]; for(i=0;i<n1;i++) tmp1[i] = arr[p+i]; for(j=0;j<n2;j++) tmp2[j] = arr[q+j+1]; tmp1[n1] = tmp2[n2] = MAX_NUM; i = j = 0; for(k=p;k<=r;k++) { if(tmp1[i]<=tmp2[j]) { arr[k] = tmp1[i]; i++; } else { arr[k] = tmp2[j]; j++; } } delete tmp1; delete tmp2;}void Merge_Sort(int* arr,int p,int r){ if(p < r) { int q = (p+r)/2; Merge_Sort(arr,p,q); Merge_Sort(arr,q+1,r); Merge(arr,p,q,r); }}int main(){ int* arr = new int[Length]; cout<< "input 10 data of arr"<<endl; for(int i=0;i<Length;i++) cin>>arr[i]; Merge_Sort(arr,0,Length-1); for(int i=0;i<Length;i++) cout<<i<<": "<<arr[i]<<endl; return 0;}
1 0
- 算法--排序算法总结
- 算法:排序算法总结
- 算法:排序算法总结
- 算法-排序算法总结
- 算法-排序算法总结
- 【排序算法】排序算法总结
- 排序算法总结---希尔排序
- 排序算法总结---冒泡排序
- 排序算法总结----快速排序
- 排序算法总结---希尔排序
- 排序算法总结【内排序】
- 排序算法之内排序总结
- 排序算法总结:冒泡排序
- 【排序算法总结】冒泡排序
- 【排序算法总结】选择排序
- 排序算法总结
- 排序算法大总结
- 排序算法总结
- 『iOS/Obj-C』Note Of 8-day Obj-C/iOS foundation course
- JAVA基础——IO流知识点完整总结版
- 股票成交价格确定方法详解
- Unity3D面试题整合
- java,maven,svn,idea环境配置
- 排序算法总结
- SpringMVC返回页面数据
- 文件中的字符编码的层次
- HDFS优缺点
- 直方图均衡化的理解
- iOS开发-assign、retain、copy、strong、weak的区别
- Android 登录界面的实现
- 《C算法》读书笔记 (2):约瑟夫
- Java基础之网络编程