日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法练习day3——190320(对数器、归并排序)

發布時間:2024/10/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法练习day3——190320(对数器、归并排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對數器的概念和使用

  • 有一個你想要測的方法a,
  • 實現一個絕對正確但是復雜度不好的方法b,
  • ?實現一個隨機樣本產生器
  • ?實現比對的方法
  • 把方法a和方法b比對很多次來驗證方法a是否正確。
  • 如果有一個樣本使得比對出錯, 打印樣本分析是哪個方法出錯
  • 當樣本數量很多時比對測試依然正確, 可以確定方法a已經正確。
  • package Sort;import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int value=100;//數組中元素絕對值的最大值int size=10;//數組中元素個數的最大值boolean flag=true;for(int i=0;i<500000;i++) {int[] arr1=randomgenerator(size,value);int[] arr2=copyArray(arr1);bubbleSort(arr1);rightMethod(arr2);if(!isEqual(arr1,arr2))flag=false;break;}System.out.println(flag?"Nice":"So bad!");}public static void bubbleSort(int[] arr) {if(arr==null||arr.length<2)return;for(int end=arr.length-1;end>0;end--) {for(int i=0;i<end;i++) {if(arr[i]>arr[i+1])swap(arr,i,i+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}public static int[] randomgenerator(int size,int value) {//隨機數生成器//Math.random()-->[0,1),double類型的//(int)((size+1)*Math.random())-->[0,size]的整型int len=(int)((size+1)*Math.random());int[] arr=new int[len];for(int i=0;i<len;i++) {//元素中,0、正數、負數都有arr[i]=(int)((value+1)*Math.random())-(int)((value+1)*Math.random());}return arr;}public static boolean isEqual(int[] a,int[] b) {//對比兩個數組是否相等:長度以及內部元素if((a==null&&b!=null)||(a!=null&&b==null))return false;if(a==null&&b==null)return true;if(a.length!=b.length)return false;for(int i=0;i<a.length;i++) {if(a[i]!=b[i])return false;}return true;}public static int[] copyArray(int[] a) {//拷貝數組,使得數組長度以及內部元素都相同if(a==null)return null;int[] arr=new int[a.length];for(int i=0;i<a.length;i++) {arr[i]=a[i];}return arr;}public static void rightMethod(int[] a) {//絕對正確的方法,用于驗證Arrays.sort(a);}}

    運行結果:

    2.歸并排序

    package Sort;public class MergeSort {public static void main(String[] args) {int[] array= {4,3,7,2,6,4,9};mergeSort(array);for(int i=0;i<array.length;i++)System.out.print(array[i]+" ");}public static void mergeSort(int[] arr) {if(arr==null||arr.length<2)return;sortProcess(arr,0,arr.length-1);//此處注意串的是下標}public static void sortProcess(int[] arr,int L,int R) {if(L==R)return;int mid= L + ((R - L) >> 1);sortProcess(arr,L,mid);sortProcess(arr,mid+1,R);merge(arr,L,mid,R);}public static void merge(int[] arr,int L,int mid,int R) {//注意此處的R是末尾元素的位置,不是長度int[] result=new int[R-L+1];//所以此處求長度應+1int p1=L;int p2=mid+1;int i=0;while(p1<=mid&&p2<=R) {//所以此處比較應該包含mid和R,就是≤,而不是</*if(arr[p1]<arr[p2])result[i++]=arr[p1++];elseresult[i++]=arr[p2++];*/result[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];}/*if(p1>mid)while(p2<=R)result[i++]=arr[p2++];if(p2>R)while(p1<=mid)result[i++]=arr[p1++];*/while(p1<=mid) {//p1沒越界,即p2越界result[i++]=arr[p1++];}while(p2<=R) {result[i++]=arr[p2++];}for(int j=0;j<result.length;j++) {//復制元素的時候,要注意下標,因為傳入的arr是從L~R的,不是從0~arr.length-1arr[j+L]=result[j];}}}

    算法復雜度:

    使用master公式:

  • ?
  • ?

    額外空間復雜度:,一個輔助數組的大小。

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的算法练习day3——190320(对数器、归并排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。