首页 > 编程语言 >数据结构与算法【基础版】:3.5排序算法之希尔排序(属于插入排序)

数据结构与算法【基础版】:3.5排序算法之希尔排序(属于插入排序)

时间:2023-02-26 15:04:31浏览次数:47  
标签:arr int 插入排序 算法 步长 排序 public


3.5排序算法之希尔排序(属于插入排序)

数据结构与算法【基础版】:3.5排序算法之希尔排序(属于插入排序)_算法

思路:

第一轮

1.先用数组长度/2等于一个值,该值就是区间的步长(做为比较)

  • 9 / 2 = 4

2.让每个部分都做一个插入排序

  • 第一部分的比较:

  • 后续部分一样,都做一次插入排序

第二轮

1.在将除过的值/2等于一个值,该值就是区间的步长(做为比较)

  • 4 / 2 = 2

2.让每个部分都做一个插入排序

  • 第一部分的比较:
  • 第二部分的比较:

第三轮

1.在将除过的值/2等于一个值,该值就是区间的步长(做为比较)

  • 2 / 2 = 1

2.让每个部分都做一个插入排序
最后就可以得出结果了!

代码:
package main.java.com.LiKou.arithmetic;

import java.util.Arrays;

/**
* 希尔排序:
* 比直接插入排序的效率高
*/
public class ShellSort {

public static void main(String[] args) {
int[] arr = new int[]{3, 7, 8, 2, 1, 4, 6, 9, 0};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}

public static void shellSort(int[] arr){ //希尔排序
//遍历所有的步长
for(int d = arr.length / 2; d > 0; d /= 2){
//遍历所有的元素
for(int i = d; i < arr.length; i++){
//遍历本组中所有的元素
for(int j = i - d; j >= 0; j -= d){
//如果当前元素大于加上步长后的元素
if(arr[j] > arr[j + d]){
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
}
}
}


标签:arr,int,插入排序,算法,步长,排序,public
From: https://blog.51cto.com/u_15980166/6086607

相关文章

  • python--排序总结
    1.快速排序a.原理快速排序的基本思想是在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放人最终位置后,整个数据序列被基准分割成两个子序列,所有小于基......
  • 排序Comparable 和 Comparator的区别
    [1]区别[1.1]源码上的区别  ​​comparable​​​接口实际上是出自​​java.lang​​​包,它有一个​​compareTo(Objectobj)​​方法用来排序;  ​​comparator​​......
  • 数据结构与算法
     栈用python实现栈方法一:classStack:def__init__(self):self.items=[]defisEmpty(self):returnself.items==[]defpush(s......
  • 【数据结构-排序】快速排序的非递归算法
    参考此文章:《非递归算法——快速排序、归并排序》算法原理图:算法代码:#include<stdio.h>#include<stack>usingnamespacestd;//记录区间左右两端索引值typede......
  • 《分布式技术原理与算法解析》学习笔记Day23
    分布式数据复制我们在进行分布式数据存储设计时,通常会考虑对数据进行备份,以提高数据的可用性和可靠性,“数据复制技术”就是实现数据备份的关键技术。什么是数据复制技术?......
  • 在排序数组中查找元素的第一个和最后一个位置---二分查找
    在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果......
  • 搜索旋转排序数组---二分查找
    搜索旋转排序数组整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k]......
  • 算法基础1.1.2归并排序
    前言归并排序的思路其实和快速排序的很像,都有递归的过程。但是区别是:快速排序是先处理好这一层,然后再进行传递,在传递到底后,其实排序就已经完成了。而归并排序是先直接一......
  • 时间击败100%用户的快慢指针删除链表中的倒数第n个节点算法
    //给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 ///***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNoden......
  • 考研算法辅导课笔记:第十七讲--枚举和位运算
    这节课主要讲枚举,位运算成员函数booloperator<(constRange&b)const{};括号中的const表示参数b对象不会被修改;在函数末尾加CONST这样的函数叫常成员函数。常成员函......