演算法問題 歸併排序的思想

2021-10-24 03:14:23 字數 2705 閱讀 8254

劍指 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...