各类排序算法实现(亲测)

排序算法通常分为外部排序和内部排序,通常所说的八类排序属于内部排序;
这里写图片描述
外部排序在此不说明,主要给出八类排序的简单思想和实现:
1.插入排序
1.1 直接插入排序:
每次将一个新数,插入到已经排列好的有序序列当中,新数作为key值和有序序列中的数值比较。
代码实现

#include <stdio.h>
void main(){int i,j,key;int A[7]={12,41,23,17,5,2,38};for(j=1;j<7;j++){key=A[j];for(i=j-1;i>=0;i--){if(A[i]>key){A[i+1]=A[i];}else{break;}}A[i+1]=key;}for(i=0;i<7;i++){printf("%d-",A[i]);}
}
1.2希尔排序

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序;思想是将待排序的序列分成若干子序列,对每个子序列进行直接插入排序,当序列基本有序时,最后再进行一次直接插入排序;增量d取值:d = {n/2 ,n/4, n/8 …..1}
代码实现:

#include <stdio.h>
#include <iostream>
using namespace std;
void shellInsert(int a[],int n,int dk){for(int i=dk;i<n;i++){if(a[i]<a[i-dk]){int key = a[i];//cout<<key;int j=i-dk;//a[i]=a[j];while(key<a[j] && j >=0 ){a[j+dk]=a[j];j-=dk;}a[j+dk]=key;}}
}
void shellSort(int a[],int n){int dk = n/2;
//      cout << dk;while (dk >= 1){cout <<"dk:"<<dk<<"\n";shellInsert(a,n,dk);dk=dk/2;}for (int i=0;i<n;i++){cout << a[i]<<",";}
}int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};shellSort(a,13);return 0;
}

2 选择排序
2.1 简单选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的
与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
代码实现:

#include <iostream>
using namespace std;
int selectMiniKey(int a[],int n,int b){int min=b;for (int j=b+1;j<n;++j){if(a[j]<a[min]){min=j;}}return min;
}
void selectSort(int a[],int n){int min,temp;for(int i=0;i<n;++i){min=selectMiniKey(a,n,i);if(i!=min){temp=a[i];a[i]=a[min];a[min]=temp;}}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};selectSort(a,13);for(int i=0;i<13;++i){cout << a[i]<<",";}return 1;
}
简单选择排序的改进--二元选择排序
每次同时挑选出最小的和最大的:
代码实现:
#include <iostream>
using namespace std;void selectSort2(int a[],int n){int min,max,temp;for(int i=1;i<=n/2;i++){min=i-1,max=i-1;for (int j=i;j<=n-i;j++){if(a[j]>=a[max]){max=j;continue;}if(a[j]<=a[min]){min=j;}}cout<<a[min]<<":"<<a[max]<<"\n";/***watch out the swap order,it matters if i-1==max,then the min swap will have effect on max swap*/if((i-1)!=max){temp=a[i-1];a[i-1]=a[min];a[min]=temp;temp=a[n-i];a[n-i]=a[max];a[max]=temp;}else{temp=a[n-i];a[n-i]=a[max];a[max]=temp;temp=a[i-1];a[i-1]=a[min];a[min]=temp;}//temp=a[n-i];a[n-i]=a[max];a[max]=temp;cout<<i<<":";for(int z=0;z<n;++z)cout<<a[z]<<",";cout << "\n";}}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};selectSort2(a,13);for(int i=0;i<13;++i){cout << a[i]<<",";}return 1;
}
2.2 堆排序
首先将待排序的序列构建成一个大顶堆或者小顶堆;之后将堆顶元素与最后一个元素交换,选择出最大或者最小的元素;之后将前面n-1个元素重新调整为一个大顶堆或者小顶堆,重复上面的过程,直到选择出最后一个元素;堆排序的过程其实就分为两步:一是构建堆;二是调整堆,事实上构建堆的过程也是通过调整堆来实现的。
代码实现:(递归实现)
#include<iostream>
using namespace std;
void printHeap(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void heapAdjust(int a[],int s,int e){int tmp=a[s];int child=2*s+1;if(child>=e) return;if(child+1<e && a[child]<a[child+1]){++child;}if(a[s]<a[child]){a[s]=a[child];a[child]=tmp;heapAdjust(a,child,e);}
}
void heapBuild(int a[],int n){for(int i=(n-1)/2;i>=0;--i){heapAdjust(a,i,n);}
}
void heapSort(int a[],int n){heapBuild(a,n);printHeap(a,n);for(int i=n-1;i>=0;--i){int tmp=a[0];a[0]=a[i];a[i]=tmp;heapAdjust(a,0,i);}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};heapSort(a,13);printHeap(a,13);return 1;
}

3 交换排序
3.1 冒泡排序
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
代码实现:

#include<iostream>
using namespace std;
void printArray(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void bubleSort(int a[],int n){for (int i=0;i<n;++i){for(int j=0;j<n-i;++j){if(a[j]>a[j+1]){int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}printArray(a,n);
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};bubleSort(a,13);return 1;
}
3.2快速排序
思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小,另一部分记录的元素值比基准值大,此时基准元素在其排好序后的正确位置;然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
代码实现:
#include<iostream>
using namespace std;void printArray(int a[],int n){for (int i=0;i<n;++i)cout<<a[i]<<",";cout << "\n";
}
void swap(int *a,int *b){int tmp=*a;*a=*b;*b=tmp;
}
int partitionKey(int a[],int low,int high){int key=a[low];while(low<high){/**whatch the if condition is >= and --high not high--*/while(low<high && a[high]>=key)--high;swap(&a[low],&a[high]);while(low<high && a[low]<=key) ++low;swap(&a[low],&a[high]);}return low;
}
void quickSort(int a[],int low,int high){if(low<high){int key=partitionKey(a,low,high);/**watch that edge number dose not contain key itself*/quickSort(a,low,key-1);quickSort(a,key+1,high);}
}
int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};quickSort(a,0,12);printArray(a,13);return 1;
}

4 归并排序
思想:将两个有序表归并成一个有序表;注意是两个有序表;对于一个待排序列来说,可以将代排序列分成若干个子序列,调整子序列有序后,再将子序列归并成一个更大的有序列,直到序列全部有序。
代码实现

#include<iostream>
using namespace std;void printArray(int a[],int n){for(int i=0;i<n;++i)cout<<a[i]<<",";cout<<"\n";
}
void merge(int a[],int b[],int first,int mid,int last){int k=0,i=first,j=mid+1,n=last,m=mid;while(i<=m && j<=n){if(a[i]<a[j]){b[k++]=a[i++];}else{b[k++]=a[j++];}}while(i<=m) b[k++]=a[i++];while(j<=n) b[k++]=a[j++];for(int s=0;s<k;s++){a[s+first]=b[s];}}
void mergeSort(int a[],int b[],int s,int e){int mid;if(s==e) return;mid=(s+e)/2;mergeSort(a,b,s,mid);
}
void mergeSortRecursive(int a[],int n){int *p = new int[n];if(p==NULL) return;mergeSort(a,p,0,n-1);printArray(a,n);
}int main(){int a[13]={12,45,67,8,90,34,25,67,9,10,14,78,29};mergeSortRecursive(a,13);return 1;
}

5 基数排序
比较简单,就不实现了,感兴趣的可以看一下http://blog.csdn.net/hguisu/article/details/7776068这篇博客,讲的比较细.

转载于:https://www.cnblogs.com/wesia/p/5747372.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础:声音的相关知识笔记

1、声音的相关概念 模拟声音信号&#xff1a;声波在时间和幅度上都是连续的模拟信号。 1.1 声音的组成 幅度&#xff1a;声波的振幅。计量单位是分贝&#xff08;dB&#xff09; 频率&#xff1a;声波每秒变化的次数&#xff0c;用Hz表示。人耳能听到的声音信号的频率范围20Hz~…

ansi编码_Java 字符编码

点击上方蓝字关注我们&#xff01;作者介绍王云静&#xff0c;Java 开发工程师&#xff0c;2018 年 7 月加入去哪儿网&#xff0c;目前在目的地 - 呼叫中心。曾获得过 ACM 亚洲区域赛铜牌。-----基本概念字符集字符(Character)是各种文字和符号的总称&#xff0c;包括各国家文字…

外卖和快递行业数据_下周一起,整治全面启动!锁定全市外卖、快递行业!

为加强我市外卖、快递行业电动自行车交通安全管理&#xff0c;降压预防事故&#xff0c;营造良好的通行秩序&#xff0c;下周一起(12月21日)深圳交警将开展电动自行车交通安全月暨外卖、快递行业集中整治行动。⭕圈重点⭕下周一起(12月21日)正式开展外卖、快递行业集中整治行动…

计算机基础:图形、图像相关知识笔记

1、图形、图像的基础知识 图形&#xff1a;由称为矢量的数学对象所定义的直线和曲线等组成。 图像&#xff1a;也称为栅格图像&#xff0c;由点阵图或位图图像、用像素来代表图像。每一个像素都被分配一个特点的位置和颜色值。 图形和图像之间在一定条件下可以互相转换&#xf…

计算机应用用什么样的笔记本,制图用什么笔记本好

以前人们常说的绘画都是在纸上&#xff0c;然而科技时代的到来也让绘画的方式有了改变&#xff0c;而且现实中还在发展电子商务&#xff0c;因此大家都开始使用计算机制图&#xff0c;不同的计算机制图的方式不一样&#xff0c;专业使用电脑制图的人都会对电脑比较挑剔。它们还…

【代码笔记】iOS-下拉选项cell

一&#xff0c;效果图。 二&#xff0c;工程图。 三&#xff0c;代码。 RootViewController.h #import <UIKit/UIKit.h> //加入头文件 #import "ComboBoxView.h"interface RootViewController : UIViewController {ComboBoxView *_comboBox; }end RootV…

宽量程电压电流 stm32_万用表你只会量电压电流?史上最全万用表手册,这么做你不会烧表...

一&#xff0c;万用表使用前的准备。二&#xff0c;万用表各个档位的含义。三&#xff0c;万用表测量电压。四&#xff0c;万用表测量电流。五&#xff0c;万用表测量电阻。六&#xff0c;万用表测量二极管。七&#xff0c;万用表测量电容。八&#xff0c;万用表一般的维护保养…

24个笔画顺序表_小学一年级语文26个汉语拼音字母要点+田字格儿歌,赶紧给孩子看...

126个汉语拼音字母要点汉语拼音字母表-声母表汉语中每个音节起始处的辅音可以构成声母。汉语拼音方案《声母表》规定的声母符号一共有23个。b [玻] p [坡] m [摸] f [佛]d [得] t [特] n [讷] l [勒]g [哥] k [科] h [喝] j [基] q [欺] x [希]z [资] c[雌] s [思] r [日] zh[知…

多媒体基础:动画和视频知识笔记

1、动画和视频的概念 动画&#xff1a;将静态的图像、图形等按照一定的时间顺序显示而形成的连续的动态画面。传统意义来说动画是在连续多格的胶片上拍摄的一系列画面&#xff0c;比将胶片以一定的速度放映&#xff0c;从而产生动态的视觉技术。 视频&#xff1a;活动的、连续的…

mongoDB的安装(一)

0、安装环境说明&#xff1a; linux系统&#xff1a;centos6.5 mongoDB版本&#xff1a;mongodb-linux-x86_64-rhel62-3.2.7.tgz 1、下载 mongoDB的下载&#xff1a;https://www.mongodb.com/download-center#community&#xff0c;注意选择版本 2、解压 tar -zxvf mongodb-lin…

计算机管理任务计划程序损坏,win7弹出任务计划程序窗口显示该任务映像损坏或已篡改0x80041321错误代码怎么办...

最近有win7 64位专业版系统用户到本站反馈说碰到这样一个问题&#xff0c;就是电脑突然弹出一个任务计划程序窗口&#xff0c;显示该任务映像损坏或已篡改0x80041321错误代码&#xff0c;遇到这样的问题该如何处理呢&#xff0c;本文就给大家讲解一下win7弹出任务计划程序窗口显…

Visual paradigm社区版下载及中文菜单的设置

免费的官网社区版链接为&#xff1a; https://www.visual-paradigm.com/download/community.jsp 设置中文菜单 安装之后&#xff0c;由于如果想设置中文菜单的话&#xff0c;可能会遇到麻烦&#xff0c;因为菜单太多 如下图&#xff0c;所示步骤&#xff1a; Window-->…

python画函数图像要用到的模块_教你如何绘制数学函数图像——numpy和matplotlib的简单应用...

numpy和matplotlib的简单应用 一、numpy库 1.什么是numpy NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵&#xff0c;比Python自身的嵌套列表&#xff08;nested list structure)结构要高效的多&#xff08;该结构也可以用来表示矩阵&#xff…

台式电脑如何使用无线网,wifi怎么连接?

随着网络的发展&#xff0c;现在无线路由器已经深入到寻常百姓家了&#xff0c;无线信号满街都是&#xff0c;但是作为台式电脑&#xff0c;却不具备wifi自动连接这个功能。那么&#xff0c;台式电脑怎么用wifi呢&#xff1f;下面小编就教大家wifi如何连接。1、电脑必须安装一块…

软件测试的缺陷管理系统有哪些,简述:一款优秀的缺陷管理系统有哪些功能特点!...

原标题&#xff1a;简述&#xff1a;一款优秀的缺陷管理系统有哪些功能特点&#xff01;什么是缺陷管理系统&#xff1f;缺陷管理系统指的是在软件生命周期中识别、管理、沟通任何缺陷的过程(从缺陷的识别&#xff0c;到缺陷的解决关闭)&#xff0c;确保缺陷被跟踪管理而不丢失…

JVM——类加载机制

虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 在Java语言中&#xff0c;类型的加载、连接和初始化过程都是在程序运行期间完成的&…

操作系统基础知识笔记

一、操作系统相关概念 计算机软件&#xff1a;系统软件和应用软件。 计算机系统资源&#xff1a;硬件资源、软件资源。 硬件资源&#xff1a;中央处理器、存储器、输入、输出等物理设备。 软件资源&#xff1a;以文件形式保存到存储器上的程序和数据信息。 定义&#xff1a;有效…

python一般学多久可以考试_为何Python适合初学者 一般Python要学习多久

为何Python适合初学者?一般Python要学习多久?很多人都觉得&#xff0c;Python是一门很好学的语言&#xff0c;非常适合入门。但更多人都是不清楚具体原因的。那么&#xff0c;我们不如一起来看看Python为何更适合初学者&#xff0c;为何更适合学习吧。另外&#xff0c;这门伟…

操作系统基础:进程知识笔记(一)

进程介绍 进程管理也称为处理机管理。进程主要是为了解决多道程序批处理系统和分时系统中针对多个并发执行的程序&#xff0c;用来描述系统中执行时动态变化过程。进程属于自愿分配和独立运行的基本单位。 1、进程的概念知识 1.1 程序顺序执行的特征 程序顺序执行的特征&#x…

JVM——三个ClassLoader详解

类装载工作由ClassLoader及其子类负责&#xff0c;ClassLoader是一个重要的Java执行时系统组件&#xff0c;它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader&#xff1a;根装载器、ExtClassLoader&#xff08;扩展类装载器&#xff09;和AppClassL…