堆排序:
一般都是对数组进行排序,这里我创建大顶堆来进行从小到大的排序,其实数组都是有下标的,我们可以将该数组写成完全二叉树的形式,然后再建立堆,大顶堆就是根大于左子节点和右子节点,对于每个子树都是一样的。这就是大顶堆堆,小顶堆反之。
再进行堆排序的时候我分为以下几步来实现的:
1创建大顶堆:通过对完全二叉树的分析可以看出,我们只需要对一半的元素进行建立堆的操作之后就可以实现堆所有的元素进行操纵,建立初始堆
2接下来是建立大堆:是每个小子树的根与自己的左子节点和右子节点进行相应的比较之后,将最大的元素进行相应的冒泡,一直进行递归的相应操作之后角可以实现将最大的元素冒泡到顶堆。
3冒泡到顶堆之后然后进行交换将顶堆(即是数组中的第一个元素)元素交换到数组的最后,之后进行建立大堆,进行循环n-1次之后就可以实现对所有的元素得到排序。
堆排序的时间复杂度为O(nlogn) 空间复杂对为O(1),是一种不稳定的排序方法。
堆排序的代码如下所示
public class HeapSort { public void heapSort(int[] a) { if (a == null || a.length <= 1) { return; } createMaxHeap(a);//创建最大堆 for (int i = a.length - 1; i >= 1; i--) { //最大的在0位置,开始沉降,每交换一次最大的值都交换到最后面 swapElements(a, 0, i); //继续获取0位置的最大值 maxHeap(a, i, 0); } } //这里是创建初始堆的大小 private void createMaxHeap(int[] a) { if (a == null || a.length <= 1) { return; } int half = (a.length - 1) / 2; //只需要判断数组元素的一半就可以实现对堆的处理 for (int i = half; i >= 0; i--) { maxHeap(a, a.length, i); } } //建立大堆 private void maxHeap(int[] a, int length, int i) { int left = 2 * i + 1; int right = 2 * i + 2; int max = i; if (left < length && a[left] > a[i]) { max = left; } if (right < length && a[right] > a[max]) { max = right; } if (i != max) { swapElements(a, i, max); maxHeap(a, length, max); } } //元素进行交换 private void swapElements(int[] a, int i, int max) { int temp = a[i]; a[i] = a[max]; a[max] = temp; }
简单选择排序:按从小到大分析,每次找一个最小的元素交换到前面,之后再次,每次之后i++,之后再次找到最小的往前交换,之后经过多次循环之后得到有序数组
代码实现如下:
public class SimpleSelectSort { public void selectSort(int[] a) { int min; int temp; for (int i=0;i<a.length;i++){ min=a[i]; for (int j=i;j<a.length;j++){ if (a[j]<min){ min=a[j]; temp=a[i]; a[i]=min; a[j]=temp; } } } for (int k:a){ System.out.print(k+" "); } } public static void main(String[] args) { SimpleSelectSort sss=new SimpleSelectSort(); sss.selectSort(new int[]{9,8,7,6,5,4,3,2,1}); } }