åºãç¥ããã¦ããinsertion sortã®ã³ã¼ãã¯é§ç®ããã
insertion sortã¯ãæ¿å
¥ã½ã¼ããã¨è¨³ãããã(Wikipediaâ http://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88 )
â ãæ¥æ¬èªç
Wikipediaã®æ¥æ¬èªã®ãã¼ã¸ã®ã³ã¼ããå¼ç¨ããã¨æ¬¡ã®ããã«ãªã£ã¦ããã
for (i = 1; i < n; i++) { tmp = data[i]; for (j = i; j > 0 && data[j-1] > tmp; j--) { data[j] = data[j-1]; } data[j] = tmp; }
ä¸ã®ã³ã¼ãã§ã¯ãå å´ã®ã«ã¼ãã§insertã®å¿ è¦ããªãã£ãå ´åã§ãæå¾ã«data[j] = tmpã§tmpå¤æ°ãwrite backãã¦ãããããããinsertã®å¿ è¦ã®ãªãã£ãå ´åã§ãj=iã1åå®è¡ãããããããã®æå³ã«ããã¦(é度çãªè¦³ç¹ããããã°)ã¨ã¦ãç¡é§ãªã³ã¼ãã§ããã
write backãããã¨ã®å¼å®³ã¯ããã®ã³ã¼ãã§ã¯èªã¿åºããã°ããã®ã¨ããã«æ¸ãåºãã ããªã®ã§ããã®ã¡ã¢ãªã¯(ãã¾ã©ãã®ã¢ã¼ããã¯ãã£ãªã)L1 cacheã«è¼ã£ã¦ããã ããããã大ããªæã ã¨ã¯è¨ããªãããä¾ãã°ãt[X].Order ã«å¾ã£ã¦ t[X] èªä½ãæé ã½ã¼ãããããããªå ´åãwrite backã®ã³ã¹ãã馬鹿ã«ãªããªãã(sizeof(T[X])==12ãããã ã¨ãã¦)
ã©ãã®é¦¬é¹¿ãªã¢ã«ã´ãªãºã ã®æç§æ¸ããå¼ç¨ãã¦ããã®ãã¯ç¥ããªããããããªãã®ããµã³ãã«ã¨ãã¦æ²è¼ããªãã§ãããããã
â ãè±èªçã»ã¤ã¿ãªã¢èªç
次ãã§Wikipediaã®insertion sortã®è±èªã§æ¸ããããã¼ã¸ã®ã³ã¼ããè¦ã¦ãããã
insertionSort(array A) begin for i := 1 to length[A]-1 do begin value := A[i]; j := i - 1; while j >= 0 and A[j] > value do begin A[j + 1] := A[j]; j := j - 1; end; A[j + 1] := value; end; end;
ãã¡ãã¯Pascalã§æ¸ããã¦ãããããã»ã©ã®ã³ã¼ãã®å¤å½¢ã ããããã»ã©ã®ã³ã¼ãããããã«æªããjã«i-1ãå ¥ãã¦ãããããããç¡é§ã§ãj ã«ã¯ï½ãå ¥ãã¦ã"j + 1 "ã"j"ã«ã" j "ã "j - 1"ã«ããã»ããã³ã³ãã¤ã©ã¯ããã³ã¼ããçæããã ããã
j >= 0ã®å¤å®ãååã¯ä¸è¦ãªããã§ãinsertã®å¿ è¦ããªãå ´åã§ã1åç¡é§ãª j >= 0ã®å¤å®ãå¿ è¦ã«ãªããããããã¡ãã¡ãªã³ã¼ãã¨è¨ããã
â ããã©ã³ã¹èªç
åããããã©ã³ã¹èªã®ã»ããè¦ã¦ã¿ããã
#define MAX 100 void insertion(int t[MAX]) { /* Tri du tableau t par insertion sequentielle */ int i,p,j; int x; for (i = 1; i < MAX; i++) { /* Stockage de la valeur en i */ x = t[i]; /* Recherche du plus grand indice p inferieur a i tel que t[p] <= t[i] */ p = i-1; while (t[p] > x && p-- > 0) {} /* Il faut inserer t[i] juste apres cette case */ p++; /* Decalage avant des valeurs de t entre p et i */ for (j = i-1; j >= p; j--) { t[j+1] = t[j]; } t[p] = x; /* Insertion de la valeur stockee a la place vacante */ } }
ãã¡ãã¯ãè±èªçã®ãã¼ã¸ã«æ¸ããã¦ããã³ã¼ããCã§æ¸ãç´ãããã®ã ãã«ã¼ãã«ã¦ã³ã¿ã®j以å¤ã«ãç¡é§ãªpã¨ããå¤æ°ãå°å ¥ããã¦ãããinsertããå°ç¹pãæ±ãã¦ããã以éã®è¦ç´ ãã²ã¨ã¤åã«ãããã³ã¼ããªã®ã ããç¡é§ãªå¤æ°pãå¿ è¦ã«ãªãä¸ã«ããã®ãã¨ã®ã«ã¼ãã§ã¯ã«ã¼ãã«ã¦ã³ã¿ããã¦ã³ã«ã¦ã³ããã¦ãé åã®å¾ãããåã«åãã£ã¦ã¢ã¯ã»ã¹ãã¦ããã
ãã£ããinsertããå°ç¹ãæ±ã¾ã£ã¦ããã®ã«ããããreverse memory copyã§æ¸ãã¦ãã³ã³ãã¤ã©ã®æé©åãé»å®³ãããã¤ã¡ã¢ãªãã¶ã¼ããèµ·ããæå³ãããããªãããããªãã¨ã¯é¦¬é¹¿ã®ãããã¨ã ã
â ããã¤ãèªç
INSERTIONSORT(A) 1 for j = 2 to length(A) 2 do key = A[j] //Fuge A[j] ein in die sortierte Folge A[1 .. j - 1] 3 i = j - 1 4 while i > 0 and A[i] > key 5 do A[i + 1] = A[i] 6 i = i - 1 7 A[i + 1] = key
Fortranã§æ¸ãããçä¼¼ã³ã¼ããªã®ã§jã®indexã2ããå§ã¾ãããã¢ã«ã´ãªãºã ã¨ãã¦ã¯è±èªçã¨åãã ãããã話ã«ãªããªãã
â ãä¸æ
void insertion_sort(char array[], unsigned int first, unsigned int last) { int i,j; int temp; for (i = first+1; i<=last;i++) { temp = array[i]; j=i-1; //ä¸å·²æåºçæ°éä¸æ¯?ï¼å¤§äºtemp?ï¼?æ°ç§»å while((j>=first) && (array[j] > temp)) { array[j+1] = array[j]; j--; } array[j+1] = temp; } } éåæ´å¥½: void InsertSort(char array[],unsigned int n) { int i,j; int temp; for(i=1;i<n;i++) { temp = array[i];//store the original sorted array in temp for(j=i ; j>0 && temp < array[j-1] ; j--)//compare the new array with temp { array[j]=array[j-1];//all larger elements are moved one pot to the right } array[j]=temp; } }
ä¸æ®µã«æ¸ãã¦ãããéåæ´å¥½ãã¯ãã以ä¸ã®ããã«æ¸ããã»ããããããã®æå³ã ã¨æãã
åè ã¯è±èªçã®ã³ã¼ããå¾è ã¯æ¥æ¬èªçã®ã³ã¼ãã¨ã»ã¼åãã ãããã»ã©ç§ã解説ããããã«å¾è ã®ã»ããããã³ã¼ããçæãããã ãããããããã«ã¼ãã®æå¾ã§write backãã¦ããã®ã¯ããã ããªãã
â ã誰ããããªé§ç®ãªã³ã¼ããåºããã®ã
以ä¸ã§è¦ã¦ããããã«Wikipediaã®insertion sortã®ãµã³ãã«ã¯ã²ã©ããããããããæ¸ç±ãä½ãã®ä¸¸åãã§ããããinsertion sortã¨ãã¦åºãä¿¡ãããã¦ããã³ã¼ããªãã ãããã©ãã ã¨ãããã¨ã¦ãæªãã³ã¼ããåºã¾ã£ã¦ããã¨è¨ããããå¾ãªãã
insertion sortã¯é åã®è¦ç´ ãå°ãªãã¨ãããããç¨åº¦æ´é ããã¦ãããã¨ãããã£ã¦ããã¨ãã«ã¯ã¨ã¦ãæç¨ãªã¢ã«ã´ãªãºã ã§ããããã®é¢æ°ã®é«éåã¯ã¨ã¦ãéè¦ãªã®ã ã(é«éåãä¸è¦ãªãããããä½ãèããã«æåããè¨èªã©ã¤ãã©ãªã«ããqsorté¢æ°ã§ãå¼ã³åºãã¦ããã°ããããã ã)
ã²ãã£ã¨ãã¦insertion sortãææ¡ãã奴(誰ãã¯ç¥ãã)ãããããªã²ã©ãã³ã¼ããåºããã®ããç¥ããªããã ã¨ãããããã¤ã¯ããªã罪深ãã¨æãã
ä¾ãã°ãIntroduction to Algorithms, Second Editionãè¦ã¦ã¿ãã¨(第3çã¯æè¿åºãããã ãç§ã¯æã£ã¦ããªã)ã次ã®ã³ã¼ããæ²è¼ããã¦ããã
INSERTION-SORT(A) 1 for j â 2 to length[A] 2 do key â A[j] 3 > Insert A[j] into the sorted sequence A[1 .. j - 1]. 4 i â j - 1 5 while i > 0 and A[i] > key 6 do A[i + 1] â A[i] 7 i â i - 1 8 A[i + 1] â key
Wikipediaã®è±èªçã®ã³ã¼ãã¨åãã¢ã«ã´ãªãºã ã ãä¸é£ã®å£æªãªã³ã¼ãã¯ããã¤ãç¯äººããç¥ããªãã
ã¾ããã¢ã«ã´ãªãºã æ¬ã§æåãªROBERT SEDGEWICKã®èæ¸ã®ä½åãã«ã¯æ¬¡ã®ã³ã¼ããæ²è¼ããã¦ããã
procedure insertion; var i, j, v: integer; begin for i:=2 to N do begin v:=a[i]; j:=i; while a[j-1]>v do begin a[j] :=a[j-1]; j:=j-1 end; a[j] :=v end ; end ;
ãã¡ãã¯Wikipediaã®æ¥æ¬èªçã®ã³ã¼ãã¨ã»ã¼åãã ããã¡ãã®ã³ã¼ãã¯ã¾ã æãã¯ãããããä¸è¾ã«ãé«éã¨ã¯è¨ãé£ããã¤ãã§ã«è¨ãã°ããã®ã³ã¼ãã ãè¦ãã°whileã®ã¨ããã®æ¡ä»¶å¼ã«ãj > 1 &&ããå¿ãã¦ããããã«æããããa[0]ã«ã¯çªå µãç½®ãã¨æ¬æä¸ã«ããã
â ãã¾ã¨ã
çµå±ãinsertion sortã¯æåã«çºæ¡ãã奴ãããã£ã¨ãããªé§ç®ãªã³ã¼ããæ¸ããããããªããã¨æãã(ããç¥ãã)ãããã¦ãããã»ã¨ãã©ãã¹ã¦ã®ã¢ã«ã´ãªãºã ã®æç§æ¸ã§æ¡ç¨ããã¦ãããWikipediaã®insertion sortã¯è¨ãããããªã§ããã
ç§ãªãinsertion sortã¯æ¬¡ã®ããã«æ¸ããããã¯ãä¸ã§è¦ã¦ããinsertionã³ã¼ãããå ¸åçã«ã¯3å²ç¨åº¦éããä½ããç¡é§ãªwrite backã"j = i - 1"ãªã©ããã¦ããªãã®ã§ã³ã¼ããããããããã
// yaneurao's insertion sort for (int i = 1; i < MAX; i++) { int tmp = t[i]; if (t[i-1] > tmp) { int j = i; do { t[j] = t[j-1]; --j; } while ( j > 0 && t[j-1] > tmp); t[j] = tmp; } } â» whileã®æ¡ä»¶ã (t[j] > tmp && j > 0) 㨠æ¸ãééãã¦ã¾ãããã³ã¡ã³ãæ¬ã§ãææãããã ããã®ã§ä¿®æ£ãã¾ããã
ã¾ããæé ã§ã¯ãªãéé ãªãã°ãé åã®è¦ç´ ãã²ã¨ã¤å¤ã確ä¿ãã¦ãå é ã«INT_MAXãããã®æ«å°¾ã®è¦ç´ ã«INT_MINãçªå µ(sentinel)ã¨ãã¦å ¥ãã¦ãããjã®çµç«¯ãã§ãã¯ãçç¥ãããã¨ã§ããã«æ°å²éããªãã ããã
æé ã½ã¼ãã®å ´åãt[0]ã¯äºåã«ç©ºãã¦ãããt[0] = INT_MINãªã©ãçªå µã¨ãã¦ä»£å ¥ãã¦ãããj > 0 ãçç¥ãããã¨ã§åããæ°å²éããªãã ããã