网易首页 > 网易号 > 正文 申请入驻

干货!几种常见的排序算法及代码实现

0
分享至

本文需要5分钟左右阅读完成,建议收藏以后阅读,里面都是干货,可以亲自试验一下,如果觉得好用可以帮忙点赞转发一下,谢谢!交流学习java大数据可以加群460570824。

1.直接插入排序

经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。

将第一个数和第二个数排序,然后构成一个有序序列

将第三个数插入进去,构成一个新的有序序列。

对第四个数、第五个数……直到最后一个数,重复第二步。

如何写写成代码:

首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入。

设定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。

从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。

将当前数放置到空着的位置,即j+1。

代码实现如下:

public void insertSort(int[] a){

int length=a.length;//数组长度,将这个提取出来是为了提高速度。

int insertNum;//要插入的数

for(int i=1;i<length;i++){//插入的次数

insertNum=a[i];//要插入的数

int j=i-1;//已经排序好的序列元素个数

while(j>=0&&a[j]>insertNum){//序列从后到前循环,将大于insertNum的数向后移动一格

a[j+1]=a[j];//元素移动一格

j--;

}

a[j+1]=insertNum;//将需要插入的数放在要插入的位置。

}

}

2.简单选择排序

常用于取序列中最大最小的几个数时。

(如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

遍历整个序列,将最小的数放在最前面。

遍历剩下的序列,将最小的数放在最前面。

重复第二步,直到只剩下一个数。

如何写成代码:

首先确定循环次数,并且记住当前数字和当前位置。

将当前位置后面所有的数与当前数字进行对比,小数赋值给key,并记住小数的位置。

比对完成后,将最小的值与第一个数的值交换。

重复2、3步。

代码实现如下:public void selectSort(int[] a) {

int length = a.length;

for (int i = 0; i < length; i++) {//循环次数

int key = a[i];

int position=i;

for (int j = i + 1; j < length; j++) {//选出最小的值和位置

if (a[j] < key) {

key = a[j];

position = j;

}

}

a[position]=a[i];//交换位置

a[i]=key;

}

}

3.堆排序

对简单选择排序的优化。

将序列构建成大顶堆。

将根节点与最后一个节点交换,然后断开最后一个节点。

重复第一、二步,直到所有节点断开。

代码实现如下:

public void heapSort(int[] a){

System.out.println("开始排序");

int arrayLength=a.length;

//循环建堆

for(int i=0;i<arrayLength-1;i++){

//建堆

buildMaxHeap(a,arrayLength-1-i);

//交换堆顶和最后一个元素

swap(a,0,arrayLength-1-i);

System.out.println(Arrays.toString(a));

}

}

private void swap(int[] data, int i, int j) {

// TODO Auto-generated method stub

int tmp=data[i];

data[i]=data[j];

data[j]=tmp;

}

//对data数组从0到lastIndex建大顶堆

private void buildMaxHeap(int[] data, int lastIndex) {

// TODO Auto-generated method stub

//从lastIndex处节点(最后一个节点)的父节点开始

for(int i=(lastIndex-1)/2;i>=0;i--){

//k保存正在判断的节点

int k=i;

//如果当前k节点的子节点存在

while(k*2+1<=lastIndex){

//k节点的左子节点的索引

int biggerIndex=2*k+1;

//如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在

if(biggerIndex<lastIndex){

//若果右子节点的值较大

if(data[biggerIndex]<data[biggerIndex+1]){

//biggerIndex总是记录较大子节点的索引

biggerIndex++;

}

}

//如果k节点的值小于其较大的子节点的值

if(data[k]<data[biggerIndex]){

//交换他们

swap(data,k,biggerIndex);

//将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值

k=biggerIndex;

}else{

break;

}

}

}

}

4.冒泡排序

一般不用。

将序列中所有元素两两比较,将最大的放在最后面。

将剩余序列中所有元素两两比较,将最大的放在最后面。

重复第二步,直到只剩下一个数。

如何写成代码:

设置循环次数。

设置开始比较的位数,和结束的位数。

两两比较,将最小的放到前面去。

重复2、3步,直到循环次数完毕。

代码实现如下:

public void bubbleSort(int[] a){

int length=a.length;

int temp;

for(int i=0;i<a.length;i++){

for(int j=0;j<a.length-i-1;j++){

if(a[j]>a[j+1]){

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

}

5.快速排序

要求时间最快时。

选择第一个数为p,小于p的数放在左边,大于p的数放在右边。

递归的将p左边和右边的数都按照第一步进行,直到不能递归。

代码实现如下:

public static void quickSort(int[] numbers, int start, int end) {

if (start < end) {

int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)

int temp; // 记录临时中间值

int i = start, j = end;

do {

while ((numbers[i] < base) && (i < end))

i++;

while ((numbers[j] > base) && (j > start))

j--;

if (i <= j) {

temp = numbers[i];

numbers[i] = numbers[j];

numbers[j] = temp;

i++;

j--;

}

} while (i <= j);

if (start < j)

quickSort(numbers, start, j);

if (end > i)

quickSort(numbers, i, end);

}

}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
网友父母皆为三甲医院医生,曝各自收入:父亲超过400万,母亲年收入70万+

网友父母皆为三甲医院医生,曝各自收入:父亲超过400万,母亲年收入70万+

西虹市闲话
2024-04-26 22:31:45
加沙的乱葬岗,迫使美国和以色列改变幕后交易?

加沙的乱葬岗,迫使美国和以色列改变幕后交易?

中国新闻周刊
2024-04-26 18:28:40
网友劝字节跳动将TikTok出售给美国,毕竟那是实打实的几百亿美金

网友劝字节跳动将TikTok出售给美国,毕竟那是实打实的几百亿美金

映射生活的身影
2024-04-26 15:50:40
深圳10区缩减2024年一般公共预算支出,强化“过紧日子”

深圳10区缩减2024年一般公共预算支出,强化“过紧日子”

界面新闻
2024-04-26 09:50:41
金靖回应不官宣结婚原因,大赞老公舒奕橙温柔,孩子代号首曝光

金靖回应不官宣结婚原因,大赞老公舒奕橙温柔,孩子代号首曝光

扒虾侃娱
2024-04-25 20:46:34
天哪!沙特这回的举动犹如平地惊雷,震得国际社会瞠目结舌

天哪!沙特这回的举动犹如平地惊雷,震得国际社会瞠目结舌

仴乐爱慢写
2024-04-26 20:58:23
美国驻华大使馆发布中美外长会谈内容,却有多达七处被标注为“听不清”

美国驻华大使馆发布中美外长会谈内容,却有多达七处被标注为“听不清”

不掉线电波
2024-04-26 20:21:07
57岁金龟子现身澳门永利皇宫,脸色苍白疲惫,网友:看样子输麻了

57岁金龟子现身澳门永利皇宫,脸色苍白疲惫,网友:看样子输麻了

娱圈小愚
2024-04-25 09:39:12
黑龙江“蛇女”刘玉平:06年收留一条蛇,隔天拖家带口一住17年

黑龙江“蛇女”刘玉平:06年收留一条蛇,隔天拖家带口一住17年

我是斌哥哥
2024-04-25 17:04:39
痛心!43岁抗癌网红“东东”去世,死因是胃癌,曾是一名帅气医生

痛心!43岁抗癌网红“东东”去世,死因是胃癌,曾是一名帅气医生

180°视角
2024-04-26 18:10:21
为什么说回民女人 下边 带盖,关于这几点你知道多少

为什么说回民女人 下边 带盖,关于这几点你知道多少

书中自有颜如玉
2024-04-26 17:25:21
证监会突发!姚前被查

证监会突发!姚前被查

中国基金报
2024-04-26 16:44:04
北约秘书长称中国为俄提供卫星能力和成像技术,中方驳斥:纯属捕风捉影

北约秘书长称中国为俄提供卫星能力和成像技术,中方驳斥:纯属捕风捉影

环球网资讯
2024-04-26 16:04:13
订单突破20000台,刚上市就杀疯了!续航1370km,仅售9.98万

订单突破20000台,刚上市就杀疯了!续航1370km,仅售9.98万

隔壁说车老王
2024-04-26 16:20:01
北京交管部门发布车展出行攻略:建议观众尽量选择公共交通前往

北京交管部门发布车展出行攻略:建议观众尽量选择公共交通前往

北青网-北京青年报
2024-04-25 13:17:06
果然没谈拢,布林肯访华,大批外资撤离中国,美国反帮了普京大忙

果然没谈拢,布林肯访华,大批外资撤离中国,美国反帮了普京大忙

朝晖前哨
2024-04-26 09:59:31
“读秒”官宣!皇马签约姆巴佩正式合同曝光!6000万中卫同时加盟

“读秒”官宣!皇马签约姆巴佩正式合同曝光!6000万中卫同时加盟

头狼追球
2024-04-26 20:15:21
林志玲现身机场,身穿格子长裙身材依旧在线,50岁仍是不老女神

林志玲现身机场,身穿格子长裙身材依旧在线,50岁仍是不老女神

顶牌故事会
2024-04-25 11:37:45
贾跃亭,真他娘是个人才

贾跃亭,真他娘是个人才

大猫财经Pro
2024-04-26 16:54:35
不会演别尬演!范伟一段“劳改犯出狱戏”,让观众看清演技有多假

不会演别尬演!范伟一段“劳改犯出狱戏”,让观众看清演技有多假

喵喵娱乐团
2024-04-26 16:09:28
2024-04-27 03:50:44
java分享
java分享
分享Java学习的知识
61文章数 36关注度
往期回顾 全部

科技要闻

车展观察|德系日系绝不能放弃中国市场

头条要闻

官方回应环卫工用电子秤测灰尘:正常作业达标有奖励

头条要闻

官方回应环卫工用电子秤测灰尘:正常作业达标有奖励

体育要闻

首次先发就进球居勒尔破门,卡瓦哈尔横传送助攻

娱乐要闻

金靖回应不官宣恋情结婚的原因

财经要闻

贾跃亭,真他娘是个人才

汽车要闻

2024北京车展 比亚迪的自驱力让对手紧追猛赶

态度原创

游戏
健康
手机
旅游
亲子

《庄园领主》Steam特别好评:充满游戏性 优化良好

这2种水果可降低高血压死亡风险

手机要闻

塑料就是Low?我用回11年前的iPhone 5c:手感绝了

旅游要闻

白俄,中国人的快乐福地?

亲子要闻

台湾性治疗师田雅筑:女生在夫妻生活里恐惧逃避该怎么办?

无障碍浏览 进入关怀版