[Data Structures] Insertion sort
#include <stdio.h> #include <stdlib.h> /* Straight insertion sort */ void straightInsertionSort(int seq[], int n) { int i; int j; int tmp; for (i=1; i<n; i++) {//From 1 tmp = seq[i];//Store yourself for (j=i-1; j>=0 && seq[j]>seq[i]; j--) {//Compare before, and back one by one while little than it. seq[j+1] = seq[j]; } seq[j+1] = tmp;//Insert } } /* Binary insertion sort */ void binaryInsertionSort(int seq[], int n) { int i; int j; int tmp; int low; int high; int mid; for (i=1; i<n; i++) {//From 1 tmp = seq[i];//Store yourself low = 0; high = i-1; while (low <= high) { mid = (low + high) / 2; if (seq[mid] < tmp) { low = mid + 1; } else { high = mid - 1; } } for (j=i-1; j>=low; j--) {//The low position is also the bigger number than yourself seq[j+1] = seq[j]; } seq[low] = tmp;//Insert } } /* 2-way binary insertion sort */ void twoWayBinaryInsertionSort(int seq[], int n) { int i; int j; int tmp; int low; int high; int mid; int *order = malloc( n * sizeof(int) ); int first; int final; order[0] = seq[0]; first = final = 0; for (i=1; i<=n; i++) {//From 1 if( order[0] > seq[i] ){ if(first == 0){ first = n + 1; } low = first; high = n; if( low == 0 ){ low = n+1; } while(low <= high){ mid = (low + high)/2; if(order[mid] < seq[i]){ low = mid + 1; }else{ high = mid -1; } } for(j=first; j <= high; j++){ order[j-1] = order[j]; } order[high] = seq[i]; first = (first - 1) % n; }else{ low = 1; high = final; while(low <= high){ mid = (low + high)/2; if(order[mid] < seq[i]){ low = mid + 1; }else{ high = mid -1; } } for(j=final; j >= low; j--){ order[j+1] = order[j]; } order[low] = seq[i]; final++; } } for(i=0;i<n;i++){ seq[i] = order[i]; } free(order); } /* Link insertion sort */ typedef struct _NODE{ int data; struct _NODE *next; }NODE; #define MAX 65535 void linkInsertionSort(int seq[], int n){ NODE *link = malloc( (n+1) * sizeof( NODE ) ); int i; int p; int q; NODE tmp; for(i=1; i<=n; i++){ link[i].data = seq[i-1]; link[i].next = -1; } link[0].data = MAX; link[0].next = 1; link[1].next = 0; p = link[0].next; q = 0; for(i=2;i<=n;i++){ while(link[p].data<link[i].data){ q = p; p = link[p].next; } link[i].next = p; link[q].next = i; p = link[0].next; q = 0; } p = link[0].next; for(i=1;i<=n; i++){ while(p<i){ p = link[p].next; } q = link[p].next; if(p != i){ tmp = link[i]; link[i] = link[p]; link[p] = tmp; link[i].next = p; } p = q; } for(i=0; i<n; i++){ seq[i] = link[i+1].data; } } /* Shell sort */ void insertSort_gap(int seq[], int n, int start, int gap) { int i; int j; int tmp; for (i=start + gap; i<n; i += gap) {//From 1 tmp = seq[i];//Store yourself for (j=i-gap; j>=0 && seq[j]>seq[i]; j -= gap) {//Compare before, and back one by one while little than it. seq[j+gap] = seq[j]; } seq[j+gap] = tmp;//Insert } } void ShellSort(int seq[], int n, int d[], int m) { int i; int start; int gap; for (i = m - 1; i >= 0; i--) { gap = d[i]; for (start = 0; start < gap; start++) { insertSort_gap(seq, n, start, gap); } } } void main() { int ancient[] = {1,9,1,2,3,4,4,5,5,7,8,9,10}; int seq[] = {1,9,1,2,3,4,4,5,5,7,8,9,10}; int n = sizeof(seq)/sizeof(int); int i; int is; printf("log.anycle.com\n"); printf("Simple insertion sort: \n"); printf("Seq:\n"); for (i=0; i<n; i++) { seq[i] = ancient[i]; printf(" %2d", seq[i]); } printf("\n"); straightInsertionSort(seq, n); for (i=0; i<n; i++) { printf(" %2d", seq[i]); } printf("\n"); printf("Binary Insert sort: \n"); printf("Seq:\n"); for (i=0; i<n; i++) { seq[i] = ancient[i]; printf(" %2d", seq[i]); } printf("\n"); binaryInsertionSort(seq, n); for (i=0; i<n; i++) { printf(" %2d", seq[i]); } printf("\n"); printf("2 way binary Insert sort: \n"); printf("Seq:\n"); for (i=0; i<n; i++) { seq[i] = ancient[i]; printf(" %2d", seq[i]); } printf("\n"); twoWayBinaryInsertionSort(seq, n); for (i=0; i<n; i++) { printf(" %2d", seq[i]); } printf("\n"); printf("Link insertion sort: \n"); printf("Seq:\n"); for (i=0; i<n; i++) { seq[i] = ancient[i]; printf(" %2d", seq[i]); } printf("\n"); linkInsertionSort(seq, n); for (i=0; i<n; i++) { printf(" %2d", seq[i]); } printf("\n"); int d[] = {1, 2, 4}; printf("Shell sort: \n"); printf("Seq:\n"); for (i=0; i<n; i++) { seq[i] = ancient[i]; printf(" %2d", seq[i]); } printf("\n"); ShellSort(seq, n, d, sizeof(d)/sizeof(int)); for (i=0; i<n; i++) { printf(" %2d", seq[i]); } printf("\n"); }
标签: Data Structures
日历
最新微语
- 有的时候,会站在分叉路口,不知道向左还是右
2023-12-26 15:34
- 繁花乱开,鸟雀逐风。心自宁静,纷扰不闻。
2023-03-14 09:56
- 对于不可控的事,我们保持乐观,对于可控的事情,我们保持谨慎。
2023-02-09 11:03
- 小时候,
暑假意味着无忧无虑地玩很长一段时间,
节假意味着好吃好喝还有很多长期不见的小朋友来玩...
长大后,
这是女儿第一个暑假,
一个半月...
2022-07-11 08:54
- Watching the autumn leaves falling as you grow older together
2018-10-25 09:45
分类
最新评论
- Goonog
i get it now :) - 萧
@Fluzak:The web host... - Fluzak
Nice blog here! Also... - Albertarive
In my opinion you co... - ChesterHep
What does it plan? - ChesterHep
No, opposite. - mojoheadz
Everything is OK!... - Josephmaigh
I just want to say t... - ChesterHep
What good topic - AnthonyBub
Certainly, never it ...
发表评论: