給定數組 如{5,8,3,1} 則有<5,3><5,1><8,3><8,1><3,1> 5個逆序對
給定數組 求其逆序對的個數
思路:歸並排序 O(NlogN) 時間復雜度 O(N) 空間復雜度
代碼:
int num = 0; //逆序對個數 void mergg(int ar[],int low,int mid,int high) { int* b = new int[high + 1]; //b[] 復制 ar[] for (int i = low;i <= high;++i) { b[i] = ar[i]; } int i = low,j = mid + 1,k = low; while (i <= mid&&j <= high) { if (b[i] <= b[j]) { ar[k++] = b[i++]; } else { ar[k++] = b[j++]; num += mid - i + 1; //發生逆序,此時由於 //a[i..m]是已經有序了,那么a[i+1], a[i+2], ... a[m]都是大於a[j]的, //都可以和a[j]組成逆序對,因此number += m - i + 1 } } while (i <= mid){ ar[k++] = b[i++]; } //這兩種情況只會發生一種 while (j <= high){ ar[k++] = b[j++]; } // delete []b; } void merge_sort(int ar[],int low,int high) //二路歸並排序 { if (low < high) { int mid = low + (high - low)/2; merge_sort(ar,low,mid); merge_sort(ar,mid + 1,high); mergg(ar,low,mid,high); } }
PS: 還是基礎最重要 掌握扎實的基礎才是王道