一、冒泡排序

冒泡排序是最简单的排序,不需要额外空间,时间复杂度为O(N^2);代码如下

import java.util.Arrays;public class BubbleSort {public static void sort(int[] arr) {for(int i=0;i<arr.length;i++) {for(int j=arr.length-1;j>i;j--) {if(arr[j]<arr[j-1]) {swap(arr,j,j-1);}}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void main(String[] args) {int[] arr= {1,5,3,2,5,1,7};sort(arr);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

二、选择排序

选择排序和冒泡排序比较相似,就是找到最小的或最大的与对应位置交换,时间复杂度也是O(N^2),代码如下

import java.util.Arrays;public class SelectedSort {public static void sort(int[] arr) {for(int i=0;i<arr.length-1;i++) {for(int j=i+1;j<arr.length;j++) {if(arr[i]>arr[j]) {swap(arr,i,j);}}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void main(String[] args) {int[] arr= {9,1,3,5,2,3,5,8,4};sort(arr);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

三、插入排序

插入排序相当于默认前面的都已经排好序,将待排的数插入进去,但要注意,得数组从后往前比较,然后进行交换,交换到合适的位置(前一个比它小,后一个比它大),则该数就插入成功了,时间复杂度也是O(N^2),代码如下

import java.util.Arrays;public class InsertSort {public static void sort(int[] arr) {for(int i=0;i<arr.length-1;i++) {for(int j=i+1;j>0;j--) {if(arr[j]<arr[j-1])swap(arr,j,j-1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void main(String[] args) {int[] arr= {6,5,1,6,8,2,7,9,5};sort(arr);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

四、归并排序

归并排序相当于结合了插入排序和分治法(merge),时间复杂度为O(NlogN),主要注意的是,merge需要额外的空间,代码如下

import java.util.Arrays;public class MergeSort {public static void sort(int[] arr,int s,int e) {if(s==e)return;sort(arr,s,(s+e)/2);sort(arr,(s+e)/2+1,e);merge(arr,s,(s+e)/2,e);}public static void merge(int[] arr,int l_s,int l_e,int r_e) {int[] temp=new int[r_e-l_s+1];//记得归并排序需要额外空间int i=l_s;int j=l_e+1;int k=0;while(i<=l_e&&j<=r_e) {if(arr[i]<=arr[j]) {temp[k]=arr[i];i++;}else {temp[k]=arr[j];j++;}k++;}while(i<=l_e) {temp[k]=arr[i];k++;i++;}while(j<=r_e) {temp[k]=arr[j];k++;j++;}k=0;while(k<temp.length) {arr[l_s]=temp[k];k++;l_s++;}}public static void main(String[] args) {int[] arr= {4,1,2,4,2,7,4,2,8,3,4,2,2,9,0};sort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

五、希尔排序

分组进行插入排序,代码如下

import java.util.Arrays;public class ShellSort {public static void sort(int[] arr) {int m=arr.length/3+1;while(m>0) {//对每个数组进行插入排序,从每个数组的第二个开始插入前面已经排好的数据中,i为要插入的数据for(int i=m;i<arr.length;i++) {//以下就是插入排序了for(int j=i;j>=m;j-=m) {if(arr[j]<arr[j-m])swap(arr,j,j-m);}}m--;}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void main(String[] args) {int[] arr= {7,1,6,3,5,6,7,9,3,5,3,6,2,4,2,6,7,8,0,10};sort(arr);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

六、快速排序

主要在于partition这个函数,即划分这个函数,不需要额外空间,代码如下

import java.util.Arrays;public class QuickSort {public static int partition(int[] arr,int start,int end) {int p=end;int i=start-1,j=end;while(true) {while(arr[++i]<arr[p]);while(j>0&&arr[--j]>arr[p]);if(i>=j)break;elseswap(arr,i,j);}swap(arr,p,i);return i;}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void quickSort(int[] arr,int start,int end) {if(start>=end)return;int index=partition(arr,start,end);quickSort(arr,index+1,end);quickSort(arr,start,index-1);}public static void main(String[] args) {int[] arr= {5,7,3,2,1};System.out.println(Arrays.toString(arr));quickSort(arr,0,4);System.out.println(Arrays.toString(arr));int i=4;while(--i<1);System.out.println(i);// TODO Auto-generated method stub}}

七、堆排序

主要在建堆,代码如下

import java.util.Arrays;
//堆排序,主要在建队
public class HeapSort {public static int leftChild(int i) {return i*2+1;}public static void Precdown(int[] arr,int i,int N) {int child=leftChild(i);if(child<N-1&&arr[child]<arr[child+1])child++;if(child<N&&arr[i]<arr[child]) {swap(arr,i,child);Precdown(arr,child,N);//一定注意需要递归,主要是在(1)处一定要递归}}public static void sort(int[] arr) {int m=arr.length/2;for(int i=m;i>=0;i--)Precdown(arr,i,arr.length);for(int i=arr.length-1;i>=0;i--) {swap(arr,0,i);Precdown(arr,0,i);//(1)处}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static void main(String[] args) {int[] arr= {4,2,5,1,3,6,6,2,6,9,4,8,1};sort(arr);System.out.println(Arrays.toString(arr));// TODO Auto-generated method stub}}

主要的七种排序(快排、希尔排序、堆排序、归并排序、选择排序、插入排序、冒泡排序)相关推荐

  1. 快排的改良版——内省式排序

    快速排序是一种很快的算法,它平均的时间复杂度WieO(nlgn), 最坏时间复杂度为O(n^2).但是快排有很多改良版,其中一种就是内省式的快排,在STL中的快快排使用的就是这种算法. 1.为什么需要 ...

  2. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  3. 数据结构:静动图结合,活灵活现 讲解—— 堆排序, 直接选择排序

    数据结构 -- 图文并茂的--> 堆排序, 直接选择排序 每博一文案 这段旅程,路途艰辛而漫长,我们都希望自己的心酸,有人能懂,委屈的 时候,有人谈,但随着年龄的增长,慢慢明白了一个道理,永远不 ...

  4. python选择排序从大到小_Python实现选择排序

    一.选择排序简介 选择排序(Selection sort)是一种简单直观的排序算法.选择排序首先从待排序列表中找到最小(大)的元素,存放到元素列表的起始位置(与起始位置进行交换),作为已排序序列,第一 ...

  5. 经典排序算法(一) —— Selection Sort 选择排序

    经典排序算法(一) -- Selection Sort 选择排序 文章目录 经典排序算法(一) -- Selection Sort 选择排序 简介 排序过程 实现 复杂度 简介 选择排序是一种简单直观 ...

  6. c语言选择排序法程序设计,C语言基础之选择排序算法和代码

    在利用C语言进行编写程序的过程中,我们会常常通过算法及其代码来进行相关程序的编写工作.今天课课家笔者先给大家介绍C语言算法中的选择排序算法以及代码.那么到底什么是选择排序算法呢?下面由笔者慢慢道来. ...

  7. 排序 ---- 快排(C语言)

    思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快排,整个过程可以递归进行,以此达到整个数据变成有序序列. 时 ...

  8. c语言选择排序步骤,C语言中如何实现选择排序算法

    选择排序法实现的步骤:首先找出一个最小数交换到最前面:然后在剩下的数中找个最小的交换到剩下数最前面:最后一直重复此步骤,直到所有数排好即可. 选择排序法实现的步骤:找出一个最小数交换到最前面,然后在剩 ...

  9. 排序算法系列之(一)——选择排序清新脱俗的一面

    · 前言 大家还记得我几个月前挖的一个大坑吗?非要自不量力的来讲讲排序家族的故事,这不是!今天我回来继续填这个坑,搞不好会把自己埋在这了/(ㄒoㄒ)/~~ 话说关于这些排序算法的总结网上各种版本的都有 ...

  10. c语言选择排序详解及代码,C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直 ...

最新文章

  1. html带颜色表格怎么做,使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作...
  2. 公司网络推广教你网站初期SEO优化该如何做?
  3. python条件查询 或 in_64.Python中ORM查询条件:in和关联模型
  4. Flask 第三方组件之 SQLAlchemy
  5. Silverlight4Beta之与剪切板通信
  6. 迈向人工通用智能与混合天玑芯片架构
  7. java控制结构_Java 控制结构与方法
  8. Chrome浏览器解决主页被劫持的问题
  9. Python接口自动化测试
  10. 华为网络设备-DHCP基础配置实验
  11. python容易挂科吗_如何应付大学的python考试而不至于挂科?
  12. android8虚拟键布局,Android 虚拟按键在不同版本上的位置问题
  13. 开发者除了技术硬实力之外,还有哪些不可或缺的软实力
  14. 2022年的电视评判标准,为何还要强调画质?
  15. stm32笔记02——ST-Link下载器使用说明
  16. VMware vCenter Server 7.0U3
  17. android deb文件怎么打开,演示apk是什么文件?怎么打开apk文件呢?
  18. cocos creator 动态设置精灵图片
  19. 堪比Wallpaper Engine的lively动态壁纸桌面软件
  20. VNC Timed out waiting for a response from the computer

热门文章

  1. 如何在Windows下搭建Qt安卓开发环境?
  2. Android小实例----TodoList
  3. As中好看背景色汇总
  4. iphone远程安装测试---被个符号链接折腾了2天, CodeResources - _CodeSignature/CodeResources
  5. jq 移动端网页分享功能_原生javascript实现分享到朋友圈功能 支持ios和android
  6. WPF运行报错 在MS.Internal.FontCache.FontFaceLayoutInfo+IntMap.TryGetValue(Int32, UInt16 ByRef)
  7. 深度学习生成对抗网络(GAN)
  8. matlab互补误差函数程序,准确计算比例互补误差函数erfcx()
  9. 解决Qt播放视频无法播放的问题
  10. 几种物联网实现方式之间的比较+转载