博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
各种排序算法的代码
阅读量:5216 次
发布时间:2019-06-14

本文共 5139 字,大约阅读时间需要 17 分钟。

1 // ALLKindsOfSorts.cpp : 定义控制台应用程序的入口点。  2 //  3   4 #include "stdafx.h"  5 #include
6 #include
7 #include
8 9 using namespace std; 10 11 ////所有的排序总结 12 13 //1、冒泡排序(O(n*n)) 14 void MaopaoSort(int *a,int len) 15 { 16 //这里要明白 17 for(int i=0;i
a[j+1])//相邻元素比较 24 { 25 //交换 26 int temp=a[j]; 27 a[j]=a[j+1]; 28 a[j+1]=temp; 29 IsChange=true;//如果一次扫描完之后都没发生任何的交换,则表明已经排好序了 30 } 31 } 32 if(!IsChange) 33 { 34 cout<<"提前结束排序"<
a[i])//跟已排序好的数进行比较,找出合适的位置 48 { 49 int temp= a[i];//将需要插入的无序数保存起来,并将所有都大于该需要插入的无序数的数后移 50 int j=i-1; 51 while(j>=0&&a[j]>temp)//从后往前扫描(j>=0是边界条件),判断已排序的数是否大于需要插入的无序数 52 { 53 a[j+1]=a[j];//如果不是合适的位置就往后移动,腾出位置出来 54 j--; 55 } 56 a[j+1]=temp;//找到了合适的位置,执行插入 57 } 58 } 59 60 } 61 62 //3、归并排序O(nlog(n))
struct Node{int v;Node* next}Node* merge_sort(Node* p){    if(p==NULL||p->next==NULL){        return NULL;	    }    Node* head1=p;    Node* mid=getmid(p);    Node* head2=mid->next;    mid->next=NULL;    head1=merge_sort(head1);    head2=merge_sort(head2);    return merge(head1,head2)}Node* getmid(Node* p){    if(p==NULL||p->next==NULL){    return NULL;	    }    Node* fast=p;    Node* slow=p;    while(fast->next!=NULL){        fast=fast->next;        if(fast->next!=NULL){        fast=fast->next;        slow=slow->next;        }    }    return slow}Node* merge(Node* p1,Node* p2){    if(p1==NULL) return p2;    if(p2=NULL) return p1;    Node* head1=p1;    Node* head2=p2;    Node* newhead=NULL;    if(head1->val<=head2->val){        newhead=head1;        head1=head1->next;    }else{        newhead=head2;        head2=head2->next;    }    Node* ptemp=newhead;    while(head1&&head2){        if(head1->val<=head2->val){        ptemp->next=head1;        ptemp=head1;        head1=head1->next;        }else{        ptemp->next=head2;        ptemp->head2;        head2=head2->next;        }    }    ptemp->next=head1?head1:head2;    return newhead;}
 

  

 
102 //4、桶排序O(n)103  //桶排序用到插入排序(O(n*n))104 void InsertSort(vector
&a,const int len)105 {106 107 for(int i=1;i
a[i])//跟已排序好的数进行比较,找出合适的位置111 { 112 int temp= a[i];//将需要插入的无序数保存起来,并将所有都大于该需要插入的无序数的数后移113 int j=i-1;114 while(j>=0&&a[j]>temp)//从后往前扫描(j>=0是边界条件),判断已排序的数是否大于需要插入的无序数115 {116 a[j+1]=a[j];//如果不是合适的位置就往后移动,腾出位置出来117 j--;118 }119 a[j+1]=temp;//找到了合适的位置,执行插入120 }121 }122 123 }124 125 //由于桶排序需要将数据分成n等份的范围,每个范围的个数不一样,因此每个桶里面装的数的个数不相同,126 //因此选用容器作为桶的数据结构127 void BucketSort(vector
&result,int *Data,int len)128 {129 if(Data==NULL||len<=0)130 return ;131 //求原始数据的最大值与最小值132 int max_value=Data[0];133 int min_value=Data[0];134 for (int i=0;i
max_value)137 max_value=Data[i];138 if(Data[i]
Bucket[10];144 //将数据分别装入相应的桶中145 for (int i=0;i
::size_type it=0;it
temp[10];//10表示十进制188 189 //将数据放入桶中190 for (int i=0;i
::size_type it=0;it
max)214 max=a[i];215 }216 int pos=1;//用来指定按哪一位来排序,最初是右边第一位217 do218 {219 //RadixSort(a,len,pos);//也可以采用函数调用的方式,避免调整指针的指向,因为在调用函数时,指针进行了复制,原始指针并没有改变220 221 vector
temp[10];//10表示十进制222 223 //将数据放入桶中224 for (int i=0;i
::size_type it=0;it
=1;i--)//控制增量的循环284 {285 for (int j=i;j
temp)290 {291 while(k>=0&&a[k]>temp)//查找合适的位置292 {293 a[k+i]=a[k];//按照增量的方式,将大的数按照增量的大小往后移增量个位置294 k=k-i;//按照增量的方式递减295 }296 //找到合适的位置后,执行插入操作297 a[k+i]=temp;298 }299 }300 }301 }302 303 //8、快速排序304 305 void QuickSort(int *a,int left,int right)306 {307 if(a==NULL||left<0||right<0)308 return ;309 int i=left,j=right;310 if(left
=temp)//若退出循环就是找到了比基准小的数319 {320 j--;321 }322 if(i
=1,size是序列长度348 {349 int lchild=2*i; //i的左孩子节点序号 350 int rchild=2*i+1; //i的右孩子节点序号 351 int max=i; //父节点 352 if(i<=size/2) //如果i是叶节点就不用进行调整 353 {354 //判断父节点和左右之节点的大小,找出最大值355 if(lchild<=size&&a[lchild]>a[max])356 {357 max=lchild;358 } 359 if(rchild<=size&&a[rchild]>a[max])360 {361 max=rchild;362 }363 //如果最大值不是父节点364 if(max!=i)365 {366 swap(a[i],a[max]);//则进行交换367 //继续比较,直到所有的父节点都比较完为止368 HeapAdjust(a,max,size);//由于max的值没变,因此最大值就是根节点 369 }370 } 371 }372 373 void BuildHeap(int *a,int size) //建立堆 374 {375 //由于需要确保最后根节点是最大值,因此是从下往上开始建堆376 for(int i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 377 {378 HeapAdjust(a,i,size);379 for(int i=1;i<=10;i++)380 cout<
<<" ";381 cout<
=1;i--)390 { //每次将最大值放入最后一个位置中,对剩下的进行调整391 swap(a[1],a[i]);//交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 392 HeapAdjust(a,1,i-1);//重新调整堆顶节点成为大顶堆393 }394 } 395 396 397 398 int _tmain(int argc, _TCHAR* argv[])399 {400 //int a[10]={0,11,21,31,41,56,6,7,8,9};401 //int b[5]={1,2,3,4,5};402 //cout<<"排序之前的值:"<
c;407 //MeageSort(c,a,10,b,5);408 409 //BucketSort(c,a,10);410 //RadisSort( a,10);411 412 //cout<<"排序之后的值:"<

 

转载于:https://www.cnblogs.com/ljy2013/p/3825045.html

你可能感兴趣的文章
java的Array和List相互转换
查看>>
java的byte[]与String相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
JavaScript AJAX原生写法
查看>>
vue:axios二次封装,接口统一存放
查看>>
Js三大特性--封装、继承以及多态
查看>>
2019年8月2日07:51:10 马上要撤
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
2018 ZJCPC
查看>>