通用歸併排序

來源:互聯網
上載者:User

    用支援遞迴的語言實現歸併排序是很簡單的。假設m_sort可以將一個數組排序,那麼m_sort的遞迴邏輯為:(m_sort的定義為void m_sort(void* arr, int left, int right))

    基礎:當right<=left時,直接返回

    歸納:求得left和right的中間值mid = (left + right) / 2,將m_sort作用於數組區間[left, mid]和[mid + 1, right],因為我們已經假設m_sort可以將數組排序,那麼經過兩次m_sort調用後,arr[left, mid]和arr[mid + 1, right]數組實際上已經變成了排序數組,之後,我們將這兩個排序數組歸併為一個排序數組。

    遞迴排序的時間複雜度為:O(n*log(n)),與快速排序的時間複雜度是一樣的,並且它還是一種穩定的排序演算法。

    參考代碼:

#include <stdio.h>#include <stdlib.h>#include <string.h>static void merge(void* arr, int(*cmp)(void*, void*), int left, int mid, int right, int size){  char* tmpArr = (char*)malloc((right - left + 1) * size);  int i = left, j = mid + 1, k = 0;  while (i <= mid && j <= right)  {    if (cmp((char*)arr + i * size, (char*)arr + j * size) <= 0)    {      memcpy(tmpArr + k * size, (char*)arr + i * size, size);      k++;i++;    }    else    {      memcpy(tmpArr + k * size, (char*)arr + j * size, size);      k++;j++;    }  }  while (i <= mid)  {    memcpy(tmpArr + k * size, (char*)arr + i * size, size);    k++;i++;  }  while (j <= right)  {    memcpy(tmpArr + k * size, (char*)arr + j * size, size);    k++;j++;  }  for (i = 0; i < k; ++i)    memcpy((char*)arr + (i + left) * size, tmpArr + i * size, size);  free(tmpArr);}static void m_sort(void* arr, int(*cmp)(void*, void*), int left, int right, int size){  if (left >= right)return;  int mid = (left + right) / 2;  m_sort(arr, cmp, left, mid, size);  m_sort(arr, cmp, mid + 1, right, size);  merge(arr, cmp, left, mid, right, size);}void mergesort(void* arr, int n, int(*cmp)(void*, void*), int size){  m_sort(arr, cmp, 0, n - 1, size);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.