1. 程式人生 > 其它 >qsdk編譯,make menuconfig 出問題

qsdk編譯,make menuconfig 出問題

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 static
void 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     }