(更新中)内部排序
来源:互联网 发布:淘宝网拉杆箱价格图片 编辑:程序博客网 时间:2024/06/16 20:26
插入排序
直接插入排序
将每一个待排记录插到前面已排序列的适当位置
#include <iostream>using namespace std;int main(){ int num[10],j; for(int i=0;i<10;i++){//i<L.length num[i]=0; } for(int i=1;i<7;i++){//第0个为哨兵位 cin>>num[i]; } for(int i=2;i<=6;i++){i<=L.length if(num[i]<num[i-1]){ num[0]=num[i]; num[i]=num[i-1];//中间空调整已排序列 for(j=i-2;num[0]<num[j];j--){ num[j+1]=num[j];//大的往后移 } num[j+1]=num[0];//归位 } } for(int k=1;k<7;k++){ cout<<num[k]<<" "; } cout<<endl; return 0;}
折半插入排序
对前面已经排好序的部分进行折半,选择合适的位置插入
using namespace std;int main(){ int num[10],low,high; for(int i=1;i<7;i++){ cin>>num[i]; } for(int i=2;i<=6;i++){ num[0]=num[i]; low=1;high=i-1; while(low<=high){//进行折半查找 int m=(low+high)/2; if(num[0]<num[m]){//插入点在低半区 high=m-1; } else{//插入点在高半区 low=m+1; } } for(int j=i-1;j>=high+1;j--){//记录后移 num[j+1]=num[j]; } num[high+1]=num[0];//插入 } for(int k=1;k<7;k++){ cout<<num[k]<<" "; } cout<<endl; return 0;}
2-路插入排序
当作一个环
#include <iostream>using namespace std;int main(){ int arr[10],temp[10],n,i,k; cin>>n; for(int i=0;i<n;i++){ cin>>arr[i]; } int first=0,final=0; temp[0]=arr[0]; for(i=1;i<n;i++){ if(arr[i]<temp[first]){// 待插入元素比最小的元素小 first=(first-1+n)%n; temp[first]=arr[i]; }else if(arr[i]>temp[final]){// 待插入元素比最大元素大 final=(final+1+n)%n; temp[final]=arr[i]; }else{// 插入元素比最小大,比最大小 k=(final+1+n)%n; while(temp[((k-1)+n)%n]>arr[i]){ temp[(k+n)%n]=temp[(k-1+n)%n]; k=(k-1+n)%n; } temp[(k+n)%n]=arr[i]; final=(final+1+n)%n; } } // 将排序记录复制到原来的顺序表里 for(k=0;k<n;k++){ arr[k]=temp[(first+k)%n]; } for(k=0;k<n;k++){ cout<<arr[k]<<" "; } cout<<endl; return 0;}
希尔排序
如图,13和49比,……,04和76比,比完了进行下一轮。增量序列是5 3 1.
这里涉及“增量序列可以各有取法”,于是没有代码。
快速排序
#include <stdio.h>int a[101],n;//定义全局变量,这两个变量需要在子函数中使用void quicksort(int left,int right){ int i,j,t,temp; if(left>right)return;temp=a[left]; //temp中存的就是基准数 i=left;j=right;while(i!=j){//顺序很重要,要先从右往左找 while(a[j]>=temp && i<j)j--; //再从左往右找 while(a[i]<=temp && i<j) i++;//交换两个数在数组中的位置 if(i<j)//当哨兵i和哨兵j没有相遇时 { t=a[i]; a[i]=a[j]; a[j]=t;} }//最终将基准数归位 a[left]=a[i]; a[i]=temp;quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程 }int main() {int i,j,t; //读入数据 scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); quicksort(1,n); //快速排序调用//输出排序后的结果 for(i=1;i<=n;i++) printf("%d ",a[i]); getchar();getchar();return 0; }
选择排序
简单选择排序
通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,和第i个记录交换
//关键代码for(i=1;i<last;i++) { k=i; for(j=i+1;j<=last;j++) if(data[j]<data[k]) k=j; if(i!=k) //第i个元素与第k个元素交换 { swap(data[k],data[i]); } }
树形选择排序
堆排序
//来源《啊哈算法》#include <iostream>using namespace std;int h[101];//存放堆的数组int n;//堆的大小void swap(int x,int y){ int temp=h[x]; h[x]=h[y]; h[y]=temp;}//向下调整函数void siftdown(int i){//传入一个需要向下调整的结点编号i int t,flag=0;//标记是否需要继续向下调整 while(i*2<=n && flag==0){//当i结点有儿子 //用t记录较小的结点编号 if(h[i]>h[i*2]) t=i*2; else t=i; if(i*2+1<=n){//如果还有右儿子 if(h[t]>h[i*2+1]) t=i*2+1; } if(t!=i){ swap(t,i); i=t;//接下来继续向下调整 } else flag=1;//没有调整的必要 }}void create(){ int i; for(i=n/2;i>=1;i--){ siftdown(i); }}//删除最大的元素int deletemax(){ int t=h[1]; h[1]=h[n]; n--; siftdown(1); return t;}int main(int argc, char *argv[]){ int num; cin>>num; for(int i=1;i<=num;i++){ cin>>h[i]; } n=num; create(); for(int i=1;i<=num;i++){ cout<<deletemin()<<" "; } return 0;}
归并排序
HDU 3743
查看原题
#include <iostream>using namespace std;int temp[1000005];long long answer;void merge(int *A,int s,int mid,int e){cout<<s<<" "<<mid<<" "<<e<<endl; int i,j,k=0; for(i=s,j=mid+1;i<=mid&&j<=e;){ if(A[i]<A[j]) temp[k++]=A[i++]; else{ //当a[i]>a[j]时,说明a[j]比前面那段都要小,所以总逆序对数要加上mid-i+1. answer+=mid-i+1; temp[k++]=A[j++]; } } while(i<=mid) temp[k++]=A[i++]; while(j<=e) temp[k++]=A[j++]; for(i=0;i<k;i++) A[s+i]=temp[i];}void mergesort(int *A,int s,int e){ if(s<e){ int mid=(s+e)/2; mergesort(A,s,mid); mergesort(A,mid+1,e); merge(A,s,mid,e); }}int main(int argc, char *argv[]){ int n,num[1000005]; while(cin>>n){ for(int i=0;i<n;i++){ cin>>num[i]; } answer=0; mergesort(num,0,n-1); cout<<answer<<endl; } return 0;}
基数排序
多关键字的排序
链式基数排序
各种排序的比较讨论
0 0
- (更新中)内部排序
- 数据结构中内部排序总结
- 解决Memsql中group_concat内部排序问题
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 内部排序
- 漫反射光照
- Java工程师路线
- eclipse创建maven项目
- 每一个小孩都是种子,请允许Ta在成长的路上跌跌撞撞。耐心的等待,种子一定能长成参天大树!
- 蓝桥杯 历届试题 翻硬币
- (更新中)内部排序
- MySQL在分页查询中出现数据重复
- javascript中if()语句条件类型为boolean
- Java并发编程
- 如何从官网下载Hibernate源码与jar包
- 历届试题 最大子阵
- Beacon of BLE
- Black Hat Python 之 网络编程的Helloworld级别程序
- 分布式文件系统:HDFS基础与应用