大根堆排序算法的基本操作:
① 初始化操作:将R[1..n]构造为初始堆;
② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
注意:
①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。
注意:1,每次新建的大根堆放到有序序列里。2,新建大根堆注意根和孩子比较过后还需要比较孩子和孙子。
1 import java.util.*; 2 public class HeapSort { 3 public void exchageElement(int[] a, int index1, int index2){ 4 int temp = a[index1]; 5 a[index1] = a[index2]; 6 a[index2] = temp; 7 } 8 public void heapSort(int[] a,int lastIndex){ 9 if(a.length == 0) return ; 10 for(int i=(lastIndex-1)/2;i>=0;i--){ 11 int k = i; //最后一个非叶子节点 12 while(2*k+1<=lastIndex){ 13 int maxIndex = 2*k+1;//把左孩子暂时当成最大 14 if(maxIndex<lastIndex){ 15 //证明有右节点 16 if(a[maxIndex]<a[maxIndex+1])maxIndex++; //如果右节点比左节点要大则最大孩子为右节点(用maxIndex++来提高时间复杂度) 17 } 18 if(a[maxIndex]>a[k]){ 19 new HeapSort().exchageElement(a,maxIndex,k); 20 k=maxIndex; 21 }else{ 22 break; 23 24 } 25 } 26 } 27 28 } 29 public static void main (String[] args) { 30 Scanner sc = new Scanner(System.in); 31 int n = sc.nextInt(); 32 int[] arrInt = new int[n]; 33 for(int i = 0;i<n;i++){ 34 arrInt[i] = sc.nextInt(); 35 } 36 HeapSort hs=new HeapSort(); 37 for(int i=arrInt.length-1;i>0;i--){ 38 hs.heapSort(arrInt,i); 39 hs.exchageElement(arrInt,0,i); 40 } 41 42 System.out.println (Arrays.toString(arrInt)); 43 } 44 }
快速排序算法的基本操作:
分析:快速排序是冒泡排序的一种升级,打怪打不过咱们升级吧···宗旨是一趟排序下来可以交换多个元素,时间复杂度为O(logn).
- 把数组的首个元素a[0]存到temp中作为第一次排序的比较对象,j表示从右到左进行比较的下标,发现比temp大则与第i个元素交换(恰好第i个元素放到temp作为基准比较元素);i表示从左到右比较的下标,发现比temp小则与第j个元素交换(此时j个元素已经复制到前面了)。如此下去直到i==j为止,一趟排序结束。
- 这样一趟排序结束后分成两个数组分别进行排序,重复第一步。
- 注意:快排两端节点分析
-
1 import java.util.*; 2 public class kuaipai { 3 public static void main (String[] args) { 4 Scanner sc = new Scanner(System.in); 5 while(sc.hasNext()){ 6 int n = sc.nextInt(); 7 int[] arrInt = new int[n]; 8 for(int i = 0;i<n;i++){ 9 arrInt[i] = sc.nextInt(); 10 } 11 int i=0;int j=n-1; 12 kuaipai kp = new kuaipai(); 13 kp.kuaiP(arrInt,i,j); 14 15 System.out.print(Arrays.toString(arrInt)); 16 } 17 } 18 public void kuaiP(int[] a, int i, int j){ 19 int low = i; 20 int hight = j; 21 if(low>=hight) return ; 22 int temp = a[low]; 23 while(low<hight){ 24 while(a[hight]>=temp&&low<hight) hight--; 25 a[low] = a[hight]; 26 while(a[low]<=temp&&low<hight) low++; 27 a[hight] = a[low]; 28 } 29 a[low] = temp; 30 kuaiP(a,0,low-1); 31 kuaiP(a,low+1,j); 32 } 33 }