劍指 offer 51. 陣列中的逆序對
/**
* filename: 逆序數對
* author: xjl
* date: 2020/8/31 13:09
* description:
*/package test_pricate;
import org.junit.test;
public class 逆序數對 else if (j > nums2.length - 1) else if (nums1[i] > nums2[j]) else
}return count;
}@test
public void test1() ;
int nums2 = ;
int i = reversepairs2(nums1, nums2);
system.out.println(i);
}/**
* 暴力的方法 時間超時的
** @param nums
* @return
*/public int reversepairs(int nums) }}
return count;
}@test
public void test() ;
int ans = reversepairs1(nums);
system.out.println(ans);
}public int reversepairs1(int nums)
int copy = new int[len];
for (int i = 0; i < len; i++)
int temp = new int[len];
return reversepairs(copy, 0, len - 1, temp);
}/**
* nums[left..right] 計算逆序對個數並且排序
** @param nums
* @param left
* @param right
* @param temp
* @return
*/private int reversepairs(int nums, int left, int right, int temp)
int mid = left + (right - left) / 2;
int leftpairs = reversepairs(nums, left, mid, temp);
int rightpairs = reversepairs(nums, mid + 1, right, temp);
if (nums[mid] <= nums[mid + 1])
int crosspairs = mergeandcount(nums, left, mid, right, temp);
return leftpairs + rightpairs + crosspairs;
}/**
* nums[left..mid] 有序,nums[mid + 1..right] 有序
** @param nums
* @param left
* @param mid
* @param right
* @param temp
* @return
*/private int mergeandcount(int nums, int left, int mid, int right, int temp)
int i = left;
int j = mid + 1;
int count = 0;
for (int k = left; k <= right; k++) else if (j == right + 1) else if (temp[i] <= temp[j]) else
}return count;
}}
148. 排序鍊錶
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
//使用快慢指標
listnode fast = head.next, slow = head;
while (fast != null && fast.next != null)
listnode tmp = slow.next;
slow.next = null;
//遞迴的去拆分
listnode left = sortlist(head);
listnode right = sortlist(tmp);
//合併鍊錶
listnode result = mergetwolists(left, right);
return result;
}/**
* 鍊錶和合併 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。
*/public listnode mergetwolists(listnode l1, listnode l2) else
}// 任一為空,直接連線另一條鍊錶
if (l1 == null) else
return dummyhead.next;
}}
分治思想的歸併排序演算法
今天看了演算法導論上歸併排序演算法部分,應用了分治思想。將書上的偽 用c 寫了出來。但書中的陣列下標都是從1開始而不是我們平時使用的從0開始,所以與書中稍有不同。如下 注釋用英語寫的,如果寫漢語,會有難看下劃線,實在不喜歡 1 include 2 using namespace std 34 voi...
排序演算法思想記錄 歸併排序演算法 遞迴
歸併排序演算法思想為每乙個陣列中的數字可以看做是單位為1的有序陣列,將兩個有序陣列進行對比後合併,然後層層對比合併,最後為排序成功的陣列 首先需要將陣列分為兩塊 然後進入遞迴左半數組和右半陣列,繼續分割為兩塊,當陣列長度為1時返回。形參為 陣列 和陣列長度 void mergesort int k,...
歸併排序(分治思想)
分治 劃分問題 把序列分成元素個數盡量相等的兩半 遞迴求解 把兩半元素分別排序 合併問題 把兩個有序表合併成乙個 include include include includeusing namespace std void merge sort int a,int x,int y,int t if...