C++歸並排序(數組&鏈表)


1、歸並排序(Merge Sort)

歸並排序的性能不受輸入數據的影響,始終都是O(n log n)的時間復雜度。代價是需要額外的內存空間。

歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。歸並排序是一種穩定的排序方法。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。

1.1 算法描述

  • 把長度為n的輸入序列分成兩個長度為n/2的子序列;
  • 對這兩個子序列分別采用歸並排序;
  • 將兩個排序好的子序列合並成一個最終的排序序列。

1.2  C++代碼(數組):

#include <iostream> #include <vector>

using namespace std;
void merge(int nums[], int left, int mid, int right) { int length1 = mid - left + 1; int length2 = right - mid; int* len1 = new int[length1+1]; int* len2 = new int[length2+1]; int i, j, k; for (i = 0; i < length1; i++) len1[i] = nums[left + i]; for (j = 0; j < length2; j++) len2[j] = nums[mid + j + 1]; len1[length1] = INT_MAX; len2[length2] = INT_MAX; for (i = 0, j = 0, k = left; k <= right; k++) { if (len1[i] <= len2[j]) nums[k] = len1[i++]; else nums[k] = len2[j++]; } delete []len1; delete []len2; } void mergeSort(int nums[], int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } } int main() { int nums[] = { 7, 5, 3, 1, 8, 6, 4, 2 }; int length = sizeof(nums) / sizeof(int); mergeSort(nums, 0, length - 1); for (int v : nums) cout << v << " "; return 0; }

 

 

2. C++代碼(鏈表):

LeetCode 148. Sort List

// 合並兩個有序的鏈表
ListNode* merge(ListNode* head1, ListNode* head2) { ListNode guard_node(0); ListNode* mList = &guard_node; while (head1 && head2) { if (head1->val <= head2->val) { mList->next = head1; head1 = head1->next; } else { mList->next = head2; head2 = head2->next; } mList = mList->next; } if (head1) mList->next = head1; if (head2) mList->next = head2; return guard_node.next; } // 鏈表實現歸並排序
ListNode* sortList(ListNode* head) { if (head == NULL || head->next == NULL) return head; ListNode* fast = head; ListNode* slow = head; while (fast->next && fast->next->next) { slow = slow->next; fast = fast->next->next; } ListNode* head2 = slow->next; slow->next = NULL; ListNode* head1 = head; head1 = sortList(head); head2 = sortList(head2); return merge(head1, head2); }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM