堆排序

java堆排序

独自空忆成欢 提交于 2019-12-04 22:24:48
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的过程描述如下: 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区; 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n]; 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。 下面用几幅图来表示上述的排序过程: 1、将数组构造成初始堆(若想升序则建立大根堆,若想降序,则建立小根堆),从最后一个节点开始调整,得到初始堆。 2、交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,交换堆顶和倒数第二个元素的位置…… 3、最后,有序扩展完成即排序完成: 有了上述的图形展示,我们可以分解一下编写代码的思路, 1、第一步,构建大(小)顶堆; 2、调整大顶堆 3、调用大顶堆的排序

Java排序算法--建立堆和堆排序(练习)

谁说我不能喝 提交于 2019-12-04 22:24:29
Java堆排序 堆排序的思想:循环建立堆,然后交换角标0的节点和角标最后的节点。即排序由两部分组成,建立堆的渗透函数,和通过循环调用渗透函数 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。 代码如下: public class Heapsort { static int a[]={49,38,65,97,76,13,27,49}; public static void main(String[]

Java八大排序---堆排序

巧了我就是萌 提交于 2019-12-04 22:23:46
堆排序: 堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。 堆是一个近似完全二叉树的结构,并同时满足堆积的性质,即子节点的键值或索引总是小于(或者大于)它的父节点。 堆的操作: 最大堆调整:将堆末端子节点做调整,使得子节点永远小于父节点 创建最大堆:将堆中的所有数据重新排序 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算 Java代码实现: import java.util.Scanner; public class Heap_sort { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入数组的大小:"); Scanner input = new Scanner(System.in); int a = input.nextInt(); int [] arr = new int[a]; for(int i = 0;i<arr.length;i++) { System.out.println("请输入数组的第"+i+"个值:"); int s = input.nextInt(); arr[i] = s; } arr

实验七

徘徊边缘 提交于 2019-12-04 18:06:41
目录 学号 2019-2020-1823 《数据结构与面向对象程序设计》实验六报告 1.实验内容 3. 实验过程中遇到的问题和解决过程 其他(感悟、思考等) 学号 2019-2020-1823 《数据结构与面向对象程序设计》实验六报告 班级: 1823 姓名: 杨凯涵 学号:20182321 实验教师:王志强 实验日期:2019年11月17日 必修/选修: 必修 1.实验内容 实验一 要求:定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。 要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位 sorting类用的是选择排序,而searching类使用的是线性查找,这两个方法都是java算法里最最最最基本的算法了。代码如下 选择排序算法 public String selectionsort(String a) { String[] s = a.split("\\s"); int[] b = new int[s.length]; for(int i=0;i<b.length;i++) { int num = Integer.parseInt(s[i]); b[i]=num; } for(int i=0;i<b.length-1;i++) {

交换与选择类排序

隐身守侯 提交于 2019-12-04 16:20:13
各种排序算法所需辅助空间 1、 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2、 快速排序为O(logn ),为栈所需的辅助空间; 3、 归并排序所需辅助空间最多,其空间复杂度为O(n ); 4、链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。 5、直接插入排序:比较次数 最少n-1次;最多(n-1)(n+2)/2 移动次数 最少0; 最多(n-1)(n+4)/2 使用一个辅助存储空间,是稳定的排序; 6、折半插入排序:比较次数 最少与最多同,都是n*log2n(其中2为底,下边表示同), 移动次数 最少0,最多时间复杂度为O(n2);(n的平方,以下也如此表示); 使用一个辅助存储空间,是稳定的排序; 7、冒泡排序: 比较最少为:n-1次,最多时间复杂度表示为o(n2); 移动次数最少为0,最多时间复杂度表示为O(n2); 使用一个辅存空间,是稳定的排序; 8、简单选择排序: 比较次数没有多少之分,均是n(n-1)/2; 移动次数最少为0,最多为3(n-1); 使用一个辅存空间,是稳定的排序; 9、快速排序:比较和移动次数最少时间复杂度表示为O(n*log2n); 比较和移动次数最多的时间复杂度表示为O(n2); 使用的辅助存储空间最少为log2n,最多为n的平方;是不稳定的排序; 10、 堆排序: 比较和移动次数没有好坏之分

实验七

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-04 16:19:06
20182334 2019-2020-1 《数据结构与面向对象程序设计》实验七报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 姬旭 学号: 20182334 实验教师:王志强 实验日期:2019年10月31日 必修/选修: 必修 1.实验内容 实验七-查找与排序-1 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。 要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位 提交运行结果图。 实验七-查找与排序-2 重构你的代码 把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301) 把测试代码放test包中 重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种) 实验七-查找与排序-3 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试 提交运行结果截图 实验七-查找与排序-4 补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个) 测试实现的算法(正常,异常

第六章-希尔排序和堆排序

拟墨画扇 提交于 2019-12-04 13:31:48
哔哩哔哩数据结构讲解地址: https://space.bilibili.com/356198029 视频讲解地址: https://www.bilibili.com/video/av75226988 希尔排序 # include<iostream> using namespace std; void shellsort(int[], int); int main() { int array [] = {55,2,6,4,32,12,9,73,26,37}; int len = sizeof(array) / sizeof(int); cout<<"输入的原始序列: "; for(int i=0; i<len; i++) // 输出原序列 cout<<array[i]<<","; cout<<endl<<endl; cout<<" ----希尔排序开始---- " << endl; shellsort(array,len); // 调用排序函数 return 0; } void shellsort(int a[], int size) { int i, j, gap; for (gap = size / 2; gap > 0; gap /= 2) // 每次的增量,递减趋势 { for (i = gap; i < size; i++) //每次增量下,进行几组插入排序,如第一步就是

20182310第九周学习总结

柔情痞子 提交于 2019-12-04 10:32:38
《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 1.二叉查找树(binary search tree):二叉树定义的扩展,一种带有附加属性的二叉树。附加属性是什么?树中的每个节点,其左孩子都要小于其父节点,而父节点又小于或等于其右孩子。 2.堆排序 3.关于堆排序的内容: 原理:根据堆的有序属性,将列表的每一个元素添加到堆中,然后一次一个的把他们从根中删除。 堆排序是一种选择排序,整体主要由构建初始堆+交换堆顶元素和末尾元素并重建堆两部分组成。其中构建初始堆经推导复杂度为O(n),在交换并重建堆的过程中,需交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。所以堆排序时间复杂度一般认为就是O(nlogn)。 堆排序时间复杂度O(nlogn)。 步骤: 步骤一:构造初始堆。将给定无序序列构造成一个堆(升序采用小顶堆,降序采用大顶堆)。 步骤二:将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。 4.删除元素(removeElement): 在二叉查找树中删除一个给定的结点p有三种情况: (1)结点p无左右子树,则直接删除该结点 (2)结点p有左子树(右子树),则把p的左子树(右子树)接到p的父节点上 (3

堆排序

我的未来我决定 提交于 2019-12-04 04:56:29
1 inline int LEFT(int i) 2 { 3 return (i * 2 + 1); 4 } 5 6 inline int RIGHT(int i) 7 { 8 return (i * 2 + 2); 9 } 10 11 void swap(int &i, int &j) 12 { 13 int temp = i; 14 i = j; 15 j = temp; 16 } 17 18 void max_heapify(int a[], int n, int i) 19 { 20 int left = LEFT(i); 21 int right = RIGHT(i); 22 int max_idx = (left < n && a[i] < a[left]) ? left : i; 23 max_idx = (right < n && a[max_idx] < a[right]) ? right : max_idx; 24 if (i == max_idx) { 25 return; 26 } 27 swap(a[i], a[max_idx]); 28 max_heapify(a, n, max_idx); 29 } 30 31 void build_max_heap(int a[], int n) 32 { 33 for (int i = n / 2 - 1; i >

07_04.堆排序

孤街浪徒 提交于 2019-12-03 17:41:33
def heap_sort(elems): """堆排序""" def siftdown(elems, e, begin, end): i, j = begin, begin * 2 + 1 while j < end: if j + 1 < end and elems[j + 1] < elems[j]: # 找elems[j + 1]与elems[j]中较小的 j += 1 if e < elems[j]: # e在三者中最小,已找到了位置 break elems[i] = elems[j] # elems[j]在三者中最小,上移 i, j = j, 2 * j + 1 elems[i] = e end = len(elems) # 建小顶堆 for i in range(end // 2, -1, -1): siftdown(elems, elems[i], i, end) for i in range((end - 1), 0, -1): e = elems[i] elems[i] = elems[0] # 取最小元素放到最后 siftdown(elems, e, 0, i) # 剩下元素再建小顶堆 e = [1, 3, 6, 4, 5] heap_sort(e) print(e) # [6, 5, 4, 3, 1] e.reverse() print(e) # [1, 3