利用Java语言实现八种排序算法(中

来源:互联网 发布:telnet 无法打开端口 编辑:程序博客网 时间:2024/05/22 04:50

5.简单选择排序

算法思想:假设待排序元素序列有n个,在第一趟排序过程中,从n个元素序列中选择最小的元素,并将其放在序列最前面位置。在第二趟排序中,从剩余n-1个元素中选择最小元素放在第二个位置。以此类推,直到没有待比较元素。

public void SelectSort(int[] nums){for(int i = 0;i<nums.length;i++){int min = i;for(int j = i+1;j<nums.length;j++){if(nums[j]<nums[min]){min = j;}}if(min!=i){swap(nums,i,min);}}}private void swap(int[] nums,int i,int min){int temp = nums[i];nums[i] = nums[min];nums[min] = temp;}

简单选择排序是一种不稳定的排序算法。时间复杂度是O(n2),空间复杂度为O(1)。


6.堆排序

          如果任意一个顶点元素都比其孩子结点元素大或者比孩子结点元素小,则称该序列为最大堆/最小堆。根节点最大/最小。

          最小/大堆用于求最小/大值,堆序列用于多次求极值的问题。在直接选择排序中,求一个序列的最小值,必须遍历该序列,在比较所有元素后才能确定最小值,时间复杂度O(n),效率低下。

         如果把数据序列堆成树。约定父母结点值比孩子节点值大/小。则求最大/小值的时间复杂度为O(1)。

        

public static void adjustHeap(int[] nums,int i,int len){int temp,j;temp = nums[i];for(j = 2 * i;j<len;j = j*2){if(j<len && nums[j]<nums[j+1])++j;if(temp >= nums[j])break;nums[i] = nums[j];i = j;}nums[i] =temp;}public static void heapSort(int[] nums){int i;for(i = nums.length/2-1;i>=0;i--){adjustHeap(nums,i,nums.length-1);}//构建一个大顶堆for(i = nums.length-1;i>=0;i--){int temp = nums[0];nums[0] = nums[i];nums[i] = temp;adjustHeap(nums,0,i-1);//将nums中前i-1个记录重新调整为大顶堆}}

7.归并排序

待排序元素序列被划分为若干个子序列,每个子序列是有序的。通过将有序子序列合并为整体有序的序列就是归并排序。其中,最常见的是2路归并排序。

private void merge(int[] nums,int[] tar,int begin1,int begin2,int n){//begin1和begin2分别是nums前后两段的起始位置,归并到目标数组tar,这两段长度都是nint i = begin1;int j = begin2;int k = begin1;//目标数组tar从k开始计数,k=begin1while(i<begin1+n && j<begin2+n && j<nums.length){if(nums[i]<nums[j]){tar[k++] = nums[i++];}else{tar[k++] = nums[j++];}}while(i<begin1+n && i<nums.length){tar[k++] = nums[i++];}while(j<begin2+n && j<nums.length){tar[k++] = nums[j++];}}private void mergepass(int[] nums,int[] tar,int n){System.out.println("子序列长度n="+n+" ");for(int i = 0;i<nums.length;i+=2*n){merge(nums,tar,i,i+n,n);}}public void mergeSort(int[] nums){int[] tar = new int[nums.length];int n = 1;while(n<nums.length){mergepass(nums, tar, n);n = n*2;if(n<nums.length){mergepass(tar,nums,n);n  = n*2;}}}


原创粉丝点击