广州网站建设联系信科海珠,wordpress搜索安全,wordpress 漂亮的主题,舆情监测软件⭐ 作者#xff1a;小胡_不糊涂 #x1f331; 作者主页#xff1a;小胡_不糊涂的个人主页 #x1f4c0; 收录专栏#xff1a;浅谈数据结构 #x1f496; 持续更文#xff0c;关注博主少走弯路#xff0c;谢谢大家支持 #x1f496; 直接选择、堆排序 1. 直接选择排序2… ⭐ 作者小胡_不糊涂 作者主页小胡_不糊涂的个人主页 收录专栏浅谈数据结构 持续更文关注博主少走弯路谢谢大家支持 直接选择、堆排序 1. 直接选择排序2. 堆排序 1. 直接选择排序 基本思想 先在元素集合array[0]–array[n]中选择关键码最小(大)的数据元素若它不是这组元素中的第一个(第一个)元素则将它与这组元素中的第一个第一个元素交换然后在剩余的array[1]–array[n]集合中重复上述步骤直到集合剩余1个元素。 代码实现 /*** 选择排序* 时间复杂度O(n^2)* 空间复杂度O(1)* 稳定性不稳定的排序* param array*/public static void selectSort(int[] array){for(int i0;iarray.length;i){int minindexi;for(int ji1;jarray.length;j){if(array[j]array[minindex]){minindexj;}}//交换元素int karray[minindex];array[minindex]array[i];array[i]k;}}2. 堆排序 堆排序(Heapsort)是指利用堆积树堆这种数据结构所设计的一种排序算法它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆排降序建小堆。 第一步采用向下调整方法建大根堆
public static void createHeap(int[] array){for(int parent(array.length-1-1)/2;parent0;parent--){shiftDown(array,parent,array.length);}}public static void shiftDown(int[] array,int parent,int length){int childparent*21;//左孩子节点while(childlength){// 如果右孩子存在找到左右孩子中较大的孩子,用child进行标记if(child1length array[child]array[child1]){childchild1;}if(array[child]array[parent]){// 将双亲与较大的孩子交换int karray[child];array[child]array[parent];array[parent]k;// parent中小的元素往下移动可能会造成子树不满足堆的性质因此需要继续向下调整parentchild;child2*parent1;}else{break;}}}第二步排序
/*** 时间复杂度O(N*logN)* 空间复杂度O(1)* 稳定性不稳定的排序* param array*/public static void heapSort(int[] array){createHeap(array);int endarray.length-1;while(end0){int karray[0];array[0]array[end];array[end]k;shiftDown(array,0,end);end--;}}