Слияние сортировать
Объединить сортировки (MERGE-СНП) основана на операции эффективного слияния сортировки алгоритм , который использует классический разделяй и властвуй (разделяй и властвуй) стратегии (разделяй и властвуй проблемные точки (Divide) на более мелкие затем рекурсивно решения проблемы, и правило (захват) этап будет получать очки на каждом этапе ответа на «ремонт» вместе, то есть, разделяй и властвуй), которое было заказано последовательности были объединены , чтобы дать полную и упорядоченную последовательность, то есть, сначала каждый суб-последовательности упорядочены, то заказал , что отрезок между промоторной последовательностью, если два объединены в отсортированный список Упорядоченный список, называемый способ слияния
1, слияние своего рода основной идеи
Последовательность упорядочения будет R [0 ... N-1] в виде п длину упорядоченной последовательности, слияния упорядоченный список пар смежных, чтобы дать п / 2 длины 2 сортируется список ; это упорядоченная последовательность слияние снова с получением п / 4 длиной 4 упорядоченной последовательности, так что повторно продолжается, чтобы получить конечную длину упорядоченной последовательности п
2, алгоритм сортировки слияния описано
(1) «разобранном» - последовательность за бинарное деление (рекурсивный)
(2) «Объединение» - разделенные сегменты последовательности после сортировки слияния двадцать два
Как объединить ?
Каждый процесс слияния упорядочены последовательности двух сегментов объединяют и затем сортируется.
Два сегмента упорядоченной последовательности R [низкий, средний] и R [середина + 1, высокий].
Во- первых , они объединены в локальную массив временного хранения R2, с завершением слияния , а затем копируется обратно R, R2.
Мы называем R [низкий, средний] первый абзац, R [середина + 1, высокое] для второго сегмента.
Две секции каждая взяты из сравнения записи по ключевым словам, в R2 на более мелкие, и, наконец, оставшаяся часть каждого сегмента непосредственно копируется в R2.
После такого процесса, уже R2 представляет собой упорядоченная последовательность, а затем скопировать его обратно в R, сортировка слиянием завершается.
1 / * последовательность длиной последовательности до половины разделить 1 * /
2 недействительными MergeSort_UptoDown ( INT * NUM, Int Пуск, INT End)
3. {
4. INT MID = Старт + (Конец - Старт) / 2 ;
. 5
. 6 ЕСЛИ ( Старт> = End)
7. {
8. возвращение ;
. 9 }
10
11. MergeSort_UptoDown (ДНО, Старт, MID);
12 MergeSort_UptoDown (ДНО, MID + 1. , Конец);
13
14 слияние (ДНО, старт, MID, Конец);
15 }
16
17. Недействительное слияние ( INT * NUM, Int Пуск, Int MID, INT End)
18 {
19. INT * ТЕМП = ( INT *) таНос ((Конец-Начало + 1. ) * SizeOf ( INT )); // пространство приложение временная область хранения после слияния двух упорядоченных областей
20 INT I = Start;
21 INT J = MID + 1. ;
22 INT K = 0 ;
23
24 в то время как (I <= MID && J <=конец)
25 {
26 , если (Num [I] <= Num [J])
27 {
28 Температура [K ++] = Num [I ++ ];
29 }
30 еще
31 {
32 Температура [K ++] = Num [j ++ ];
33 }
34 }
35
36 в то время как (я <= середина)
37 {
38 Температура [K ++] = Num [I ++ ];
39 }
40 , а (к <= конец)
41 {
42 ТЕМП [K ++] = NUM [j ++ ];
43 }
44
45 // элемент в промежуточной области сортировки, интегрированной в исходный массив
46 является для (I = 0 ; I <K, я ++ )
47 {
48 NUM [Пуск + I] = ТЕМП [I];
49 }
50
51 Свободная (TEMP);
52 }
(Источник: https: //www.cnblogs.com/chengxiao/p/6194356.html)
Полный код:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void MergeSort_UptoDown(int *num, int start, int end); 5 void Merge(int *num, int start, int mid, int end); 6 7 int main() 8 { 9 /* 归并排序(升序) */ 10 int num[10] = {5, 1, 8, 4, 7, 2, 3, 9, 0, 6}; 11 int length = sizeof(num) / sizeof(num[0]); 12 int i; 13 14 MergeSort_UptoDown(num, 0, length - 1); 15 16 for (i = 0; i < length; i++) 17 { 18 printf("%d ", num[i]); 19 } 20 21 return 0; 22 } 23 24 /* 将序列对半拆分直到序列长度为1*/ 25 void MergeSort_UptoDown(int *num, int start, int end) 26 { 27 int mid = start + (end - start) / 2; 28 29 if (start >= end) 30 { 31 return; 32 } 33 34 MergeSort_UptoDown(num, start, mid); 35 MergeSort_UptoDown(num, mid + 1, end); 36 37 Merge(num, start, mid, end); 38 } 39 40 void Merge(int *num, int start, int mid, int end) 41 { 42 int *temp = (int *)malloc((end-start+1) * sizeof(int)); //申请空间来存放两个有序区归并后的临时区域 43 int i = start; 44 int j = mid + 1; 45 int k = 0; 46 47 while (i <= mid && j <= end) 48 { 49 if (num[i] <= num[j]) 50 { 51 temp[k++] = num[i++]; 52 } 53 else 54 { 55 temp[k++] = num[j++]; 56 } 57 } 58 59 while (i <= mid) 60 { 61 temp[k++] = num[i++]; 62 } 63 while (j <= end) 64 { 65 temp[k++] = num[j++]; 66 } 67 68 //将临时区域中排序后的元素,整合到原数组中 69 for (i = 0; i < k; i++) 70 { 71 num[start + i] = temp[i]; 72 } 73 74 free(temp); 75 }