速度上 merge > cocktail > bubble。
merge sort第一次寫,想好久……
主要是要另外給一個儲存空間才比較好實作。
直接宣告array大小比用malloc動態分配快耶 -_-。
/* ACM 10327
* mythnc
* 2011/10/17 08:52:53
* run time: 0.016
* merge sort
*/
#include <stdio.h>
#define MAXARY 1000
int divide(int *, int *, int, int);
int main(void)
{
int n, i;
int ary[MAXARY], tmp[MAXARY];
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++)
scanf("%d", ary + i);
printf("Minimum exchange operations : %d\n",
divide(ary, tmp, 0, n));
}
return 0;
}
/* divide: merge sort ary */
int divide(int *ary, int *tmp, int head, int tail)
{
int half, i, j, k, c;
/* already sorted */
if (tail - head == 1)
return 0;
/* unsorted list -> divide into 2 sub lists */
c = 0;
half = (head + tail - 1) >> 1;
c += divide(ary, tmp, head, half + 1);
c += divide(ary, tmp, half + 1, tail);
/* sort 2 sublists and merge */
k = i = head;
j = half+1;
while (i < half + 1 && j < tail)
if (ary[j] < ary[i]) {
tmp[k++] = ary[j++];
c += half + 1 - i;
}
else
tmp[k++] = ary[i++];
while (i < half + 1)
tmp[k++] = ary[i++];
while (j < tail)
tmp[k++] = ary[j++];
for (i = head; i < tail; i++) /* copy the sorted list to ary*/
ary[i] = tmp[i];
return c;
}
沒有留言:
張貼留言