qsdk編譯,make menuconfig 出問題
阿新 • • 發佈:2022-05-16
java程式碼:
1 public static void main(String[] args) { 2 int arr[] = {2,7,1,5,9,6,10}; //要排序的陣列 3 int temp[] = new int[arr.length]; //中間陣列 4 mergeSort(arr,0,arr.length-1,temp); 5 System.out.println(Arrays.toString(arr)); 6 } 7 8 //分解加合併方法,即歸併排序 9 public staticvoid mergeSort(int arr[], int left,int right, int temp[]) { 10 if (left >= right) { 11 return; 12 } 13 if (left < right) { 14 int mid = (left + right)/2; //以中間索引進行分解 15 //分離左邊序列 16 mergeSort(arr, left, mid, temp); 17 //分離右邊序列 18 mergeSort(arr, mid+1, right, temp); 19 //合併 20 merge(arr, left, mid, right, temp); 21 } 22 } 23 24 //合併 25 public static void merge(int arr[], int left, int mid, int right, int temp[]) { 26 int i = left;//左邊有序序列初始索引 27 int j = mid+1;//右邊有序序列初始索引 28 int t = 0; //temp 初始索引 29 30 //先把左右兩邊有序的資料按規則填充到temp陣列中 31 //直到左右兩邊有序序列有一邊不能處理為止 32 while ( i<=mid && j<=right) { 33 //比較左邊和右邊的資料,小的那方先存入temp 34 if ( arr[i] <= arr[j]) { 35 temp[t] = arr[i]; 36 t += 1; 37 i += 1; 38 } else { 39 temp[t] = arr[j]; 40 t += 1; 41 j += 1; 42 } 43 } 44 //如果有一邊有剩餘資料則依次填入temp陣列中 45 while ( i<=mid){ 46 temp[t] = arr[i]; 47 t += 1; 48 i += 1; 49 } 50 while ( j<=right ) { 51 temp[t] = arr[j]; 52 t += 1; 53 j += 1; 54 } 55 //將temp陣列拷貝到arr中 56 //並不是一次性合併完後拷貝進陣列 57 t = 0; 58 int tempLeft = left; //左邊要合併序列的索引 59 System.out.println("tl="+tempLeft + "right"+right); 60 while(tempLeft<=right) { 61 arr[tempLeft] = temp[t]; 62 t += 1; 63 tempLeft += 1; 64 } 65 }
多執行緒版本:
1 public static void main (String[] args) throws InterruptedException { 2 int[] arr = {2,7,1,5,9,6,10,50,20,30,66,11,45,111}; 3 printArr(arr); 4 System.out.println(); 5 int[] temp = new int[arr.length]; 6 //Fork/Join 從這裡開始 7 ForkJoinPool forkJoinPool = new ForkJoinPool(); 8 ll.mergeTask task = new ll.mergeTask(arr, temp, 0, arr.length-1);//建立任務 9 forkJoinPool.execute(task);//執行任務 10 forkJoinPool.awaitTermination(2, TimeUnit.SECONDS);//阻塞當前執行緒直到pool中的任務都完成了 11 12 printArr(arr); 13 System.out.println(); 14 } 15 16 //遞迴 17 private static void mergeSort(int[] nums,int[] tmp,int left,int right){ 18 if(left<right){ 19 int center = (left+right)/2; 20 mergeSort(nums,tmp,left,center); 21 mergeSort(nums,tmp,center+1,right); 22 merge(nums,tmp,left,center+1,right); 23 } 24 } 25 26 //合併 27 private static void merge(int[] nums,int[] tmp,int leftPos, int rightPos, int rightEnd){ 28 int leftEnd = rightPos-1; 29 int tmpPos = leftPos; 30 int numElements = rightEnd - leftPos + 1; 31 32 while(leftPos<=leftEnd&&rightPos<=rightEnd){ 33 if(nums[leftPos]<nums[rightPos]) 34 tmp[tmpPos++]=nums[leftPos++]; 35 else 36 tmp[tmpPos++]=nums[rightPos++]; 37 } 38 while(leftPos<=leftEnd) 39 tmp[tmpPos++]=nums[leftPos++]; 40 41 while(rightPos<=rightEnd) 42 tmp[tmpPos++]=nums[rightPos++]; 43 44 for(int i = 0;i<numElements;i++,rightEnd--) 45 nums[rightEnd]=tmp[rightEnd]; 46 } 47 public static void mergeSort(int[] nums){ 48 int[] tmp = new int[nums.length]; 49 mergeSort(nums,tmp,0,nums.length-1); 50 } 51 52 //列印 53 public static void printArr(int[] arr) { 54 for(int i : arr){ 55 System.out.print(i+" "); 56 } 57 } 58 59 static class mergeTask extends RecursiveAction { 60 private static final int THRESHOLD = 2;//設定任務大小閾值 61 private int start; 62 private int end; 63 private int[] data; 64 private int[] tmp; 65 66 public mergeTask(int[] data, int[] tmp, int start, int end){ 67 this.data = data; 68 this.tmp = tmp; 69 this.start = start; 70 this.end = end; 71 } 72 73 @Override 74 protected void compute(){ 75 if((end - start)<=THRESHOLD){ 76 mergeSort(data,tmp,start,end); 77 }else{ 78 int center = (start + end)/2; 79 ll.mergeTask leftTask = new ll.mergeTask(data, tmp, start, center); 80 ll.mergeTask rightTask = new ll.mergeTask(data, tmp, center+1, end); 81 82 leftTask.fork(); 83 rightTask.fork(); 84 85 leftTask.join(); 86 rightTask.join(); 87 88 merge(data, tmp, start, center+1, end); 89 90 } 91 } 92 }