数据结构(四)常用排序算法-选择、插入、希尔

选择排序

实现思路:

1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。

2、每次从A集合中查找出最大或者最小的元素后放入集合B中

3、同时将该元素从集合A中移除.

4、循环执行以上两步直到集合A为空,B集合中的元素就有序了.

缺点:

效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法。

 

示范代码

public class CommSort {
    // 比较大小
    @SuppressWarnings({ "rawtypes""unchecked" })
    public int compareElement(Comparable a, Comparable b) {
        return a.compareTo(b);
    }
 
    // 交换元素
    public <T> void exchangeElement(T[] a, int i, int j) {
10          T tmp = a[i];
11          a[i] = a[j];
12          a[j] = tmp;
13      }
14   
15      // 选择排序
16      public <T> void SelectionSort(Comparable<T>[] a) {
17          int len = a.length;
18          int minIndex = 0;
19          for (int i = 0; i < len; i++) {
20              minIndex = i;
21              for (int j = i; j < len; j++) {
22                  if (compareElement(a[j], a[minIndex]) < 0) {
23                      minIndex = j;
24                  }
25              }
26              exchangeElement(a, i, minIndex);
27          }
28      }
29  }

 

插入排序

实现思路:

1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。

2、依次从集合A中获取元素并与集合B中的元素一次比较(如:按照数组下标从大到小的顺序),在集合B中找到该元素合适的位置放入(如果是升序排序,该元素应大于在它前面的元素,小于在后面的元素)

3、循环第二步操作直到集合A为空。

优点:

效率很高,特别对部分有序的数据集进行排序效果更好。

缺点:

适合小数据集的排序,对数据集比较大的集合进行排序效率较低。

示例代码:

// 插入排序
public <T> void InsertSort(Comparable<T>[] a) {
    int len = a.length;
    for (int i = 1; i < len; i++) {
        for (int j = i; j > 0 && compareElement(a[j], a[j - 1]) < 0; j--) {
            exchangeElement(a, j, j - 1);
        }
    }
}

希尔排序

实现思路:

1、实现思路与插入排序一样,唯一的不同是希尔排序在插入排序的基础上加入了跳跃比较。

2、插入排序的跳跃步进值为一直都为1。

3、希尔排序只有最后一次的轮询比较,跳跃步进值才为1.

优缺点与插入排序一样。

示例代码:

// 希尔排序
public <T> void ShellSort(Comparable<T>[] a) {
    int weight = 0;
    int len = a.length;
    while (weight < len / 3) {
        weight = 3 * weight + 1;
    }
    while (weight > 0) {
        for (int i = weight; i < len; i++) {
10              for (int j = i; j >= weight
11                      && compareElement(a[j], a[j - weight]) < 0; j -= weight) {
12                  exchangeElement(a, j, j - weight);
13              }
14          }
15          // 减小比较步进
16          weight /= 2;
17      }
18  }
时间: 2024-09-30 18:39:03

数据结构(四)常用排序算法-选择、插入、希尔的相关文章

数据结构与算法 4:排序算法,选择/插入/冒泡/希尔/快速/归并

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 排序算法 平均复杂度 冒泡排序    O(n2) 选择排序     O(n2) 插入排序     O(n2) 希尔排序     O(n1.5) 快速排序    O(N*logN) 归并排序     O(N*logN) 堆排序     O(N*logN) 基数排序     O(d(n+r)) 选择排序: [email protected]://990487026.blog.51cto.com~/sort$ c

【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)

直接插入排序: 在序列中,假设升序排序 1)从0处开始. 1)若走到begin =3处,将begin处元素保存给tmp,比较tmp处的元素与begin--处元素大小关系,若begin处<begin-1处,将begin-1处元素移动到begin:若大于,则不变化.再用tmp去和begin--处的元素用同样的方法去作比较,直至begin此时减少到数组起始坐标0之前结束. 3)以此类推,依次走完序列. 时间复杂度:O() 代码如下: //Sequence in ascending order  voi

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

数据结构——排序——8种常用排序算法稳定性分析

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

视觉直观感受7种常用排序算法

视觉直观感受若干常用排序算法 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivo

DotNet常用排序算法总结

数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法,希尔排序算法,快速排序算法. (1).选择排序算法:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(1大于等于i小于等于n)个记录交换. (2).希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]