插入、希尔、选择排序

排序:
一般是原地排序(In-place)
排序:默认情况下都是按非降序排序
稳定性:能保证排序过程中相等的数据的相对顺序不变
1.插入排序:(越接近有序,执行时间效率越高)
减治算法排序(直接插入排序,折半插入排序)
一共需要进行size-1次插入
插入过程:每次把无序区间的第一个数,在有序区间遍历(从后往前遍历)
1)找到合适的位置
2)搬移原有数据,为该数据腾出位置
2.希尔排序:(利用插入排序中,越接近有序,时间效率越高)
在插入排序之前做预排序(分组插排),使数据尽可能接近有序
先分组再对每组进行插入排序,分的组的个数为gap=gap/3+1;
直到gap==1退出
3.选择排序:(直接选择排序、堆排序)
减治算法
每次遍历无序区间(直接遍历、利用堆),找到无序区间的最大的数
把最大的数放到无序区间的最后边
一直选择n-1(n)数之后,数据完全有序
最重要的就是确定有序、无序区间
堆排序:
按升序的话,必须建大堆
按降序的话,必须建小堆

原文地址:https://blog.51cto.com/14232274/2437960

时间: 2024-10-05 08:33:34

插入、希尔、选择排序的相关文章

Java数据结构与算法(2) - 排序(冒泡、插入和选择排序)

排序需要掌握的有冒泡排序,插入排序和选择排序. 冒泡排序: 外层循环从后往前,内存循环从前往后到外层循环,相邻数组项两两比较,将较大的值后移. 插入排序: 从排序过程的中间开始(程序从第二个数组项开始a[1]),此时队列已经拍好了一部分.此时,将后边的数组项一次插入到已经排好序的部分队列中. 选择排序: 从第一个数组项开始,找到包括该数组项在内的所有往后数组项中的最小项与当前项进行交换,其实相当于依次将最小值往前冒泡. 示例代码: package chap03.BubbleSort; // bu

冒泡 选择 插入 希尔 堆 归并 快速 排序算法

排序相关概念 排序:对一序列对象根据某个关键字进行排序: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 排序耗时的操作:比较.移动: 排序分类: (1)交换类:冒泡排序.快速排序:此类的特点是通过不断的比较和交换进行排序: (2)插入类:简单插入排序.希尔排序:此类的特点是通过插入的

冒泡、选择、插入、归并、希尔等排序算法的Python实现

一,冒泡排序 时间复杂度:O(n2) 稳定性:稳定 冒泡排序我就不多讲了,大体上就是比较相邻的两个数,每次把较大的数沉底.流程图大致上如下: 图是截得别人的,只是说明一下,代码没有参看别人的,写的不好,有更好的写法可以一起探讨.下面是代码: 1 def bubble(list): 2 #print(list) 3 for index in range(1,len(list)): #比较6趟 4 print(" index: %d" %index) 5 for index2 in ran

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

快排,冒泡排,选择排序,希尔排序

package cn.hncu.dataStruct; public class SortMethods { /* 算法好坏的评价指标(一般只在n值非常大的时候才会考虑,如n取10万): * 1.时间复杂度: 通俗点,就是指程序运行的快慢(时间)---通常用计算机的运算(算术,赋值)次数来代替 * 2.空间复杂度: 占用内存空间的大小---通常用程序中使用了多少变量(栈内存.堆内存),这些变量总共占了多少内存 */ public static void main(String[] args) {

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】

一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法实现 /** * 选择排序算法 * 在未排序序列中找到最小元素,存放到排序序列的起始位置 * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾. * 以此类推,直到所有元素均排序完毕. * @param numbers */ public static void selectSort(in

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,