排序演算法 歸併排序 計數排序

2021-08-16 19:56:24 字數 1553 閱讀 1015

1. 歸併排序

將待排序序列分成兩個長度相同的子串行,對每個子串行進行排序,直至子串行剩餘乙個數,在將其合併成乙個序列

具體步驟:

分組:將待排序序列一分為2,在將子串行進行劃分,直至子串行只有乙個元素

歸併:將每個子串行進行排序,將排好序的兩個子串行進行合併

演算法分析

**

void merge(datatype* a, int left, int mid, int right)

else

}//陣列1中還有資料

if (begin1 <= end1)

}//陣列2中還有資料

if (begin2 <= end2)

}//將臨時陣列的資料拷回原陣列

index = 0;

while (index

< right - left + 1)

free(tmp);

}//歸併排序

void mergesort(datatype* a, int left, int right)

else

}

2.計數排序計數排序又稱為鴿巢原理,是對雜湊直接定址法的變形應用

具體步驟:

遍歷陣列,統計待排序陣列的範圍range

開闢陣列,大小為統計的範圍,並初始化為0

遍歷陣列,統計每個數出現的次數

將統計好陣列元素出現的次數儲存在雜湊表對應位置上,對應位置即為陣列元素大小

注意:待排序陣列中不能有負數

演算法分析

**

//計數排序

void countsort(datatype* a, size_t n)

if (a[i]>max)

}size_t range = max - min + 1;

//開闢範圍大小的陣列

datatype* count = (datatype*)malloc(sizeof(int)*range);

assert(count);

memset(count, 0, sizeof(int)*range);

//統計每個數出現的次數

for (size_t index = 0; index

< n; ++index)

//將數字拷至原陣列中

size_t index = 0;

for (size_t i = 0; i < range; ++i)

}free(count);

}

演算法筆記 歸併排序 快速排序 計數排序

public static void mergesort int a public static void mergesort int a,int start,int end 取中點 int mid start end start 2 遞迴排序左半部分 mergesort a,start,mid 遞...

四 歸併排序 非比較排序 歸併排序 計數排序

基本思想 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸...

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...