From 120515780561d058eb11585c709f5e02a150ad15 Mon Sep 17 00:00:00 2001 From: FukurouNarthil Date: Wed, 7 Jun 2017 21:12:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B8=83=E7=A7=8D=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sort.c" | 332 ++++++++++++++++++ .../Sort.h" | 41 +++ ...\350\241\214\347\273\223\346\236\2341.png" | Bin 0 -> 18109 bytes ...\350\241\214\347\273\223\346\236\2342.png" | Bin 0 -> 13058 bytes 4 files changed, 373 insertions(+) create mode 100644 "2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.c" create mode 100644 "2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.h" create mode 100644 "2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/\350\277\220\350\241\214\347\273\223\346\236\2341.png" create mode 100644 "2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/\350\277\220\350\241\214\347\273\223\346\236\2342.png" diff --git "a/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.c" "b/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.c" new file mode 100644 index 00000000..0326d054 --- /dev/null +++ "b/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.c" @@ -0,0 +1,332 @@ +#include "Sort.h" +int Move = 0; +int Compare = 0; +//刷新数组 +int *Fresh(int a[]) +{ + int *a2; + a2 = (int *)malloc(sizeof(int)*MAXSIZE); + for(int i = 0; i < MAXSIZE; i++) + { + a2[i] = a[i]; + } + return a2; +} + +//直接插入排序 +void InsertSort(int a[], int n) +{ + int i, j; + int compare = 0, move = 0; + for(i = 1; i < n; i++) + if(a[i] < a[i - 1]){ + int temp = a[i]; + compare++; + for(j = i - 1; j >= 0 && a[j] > temp; j--){ + a[j + 1] = a[j]; + move++; + } + a[j + 1] = temp; + } + printf("move = %d, compare = %d, total = %d\n", move, compare, move+compare); +} + +//希尔排序 +void ShellSort( int a[], int n ) +{ + int j, gap; + int compare = 0, move = 0; + for(gap = n / 2; gap > 0; gap /= 2) + for (j = gap; j < n; j++)//从数组第gap个元素开始   + if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序 + { + compare++; + int temp = a[j]; + int k = j - gap; + while(k >= 0 && a[k] > temp) + { + a[k + gap] = a[k]; + k -= gap; + move++; + } + a[k + gap] = temp; + } + printf("move = %d, compare = %d, total = %d\n", move, compare, move+compare); +} + +//起泡排序 +void BubbleSort( int a[], int n ) +{ + int i, j; + int compare = 0, move = 0; + for(i = 0; i < n; i++) + for(j = 1; j < n - i; j++){ + if (a[j - 1] > a[j]){ + compare++; + int temp = a[j-1]; + a[j-1] = a[j]; + a[j] = temp; + } + move+=3; + } + printf("move = %d, compare = %d, total = %d\n", move, compare, move+compare); +} + +//快速排序 +void QuickSort( int a[], int l, int r) +{ + if(l < r) + { + int temp = a[l]; + a[l] = a[(l+r)/2]; + a[(l+r)/2] = temp; + int i = l, j = r, x = a[l]; + while(i < j) + { + while(i < j && a[j] >= x)// 从右向左找第一个小于x的数 + { + j--; + Compare++; + } + if(i < j){ + a[i++] = a[j]; + Move++; + } + while(i < j && a[i] < x)// 从左向右找第一个大于等于x的数 + { + i++; + Compare++; + } + if(i < j){ + a[j--] = a[i]; + Move++; + } + } + a[i] = x; + QuickSort(a, l, i -1);// 递归调用 + QuickSort(a, i+ 1, r ); + } +} + +//简单选择排序 +void SelectSort( int a[], int n ) +{ + int min; + int move = 0; + int compare = 0; + for(int i = 0; i < n - 1; i++) + { + min = i; + for(int j = i + 1; j < n ; j++) + { + if(a[j] < a[min])//使得min总是指向最小元素 + { + compare++; + min = j; + } + } + if(min != i)//即min有移动过 + { + int temp = a[i]; + a[i] = a[min]; + a[min] = temp; + } + move+=3; + } + printf("move = %d, compare = %d, total = %d\n", move, compare, move+compare); +} + +//堆排序 +void HeapAdjust(int a[], int i, int n) +{ + int Child; + int temp; + for(;2 * i + 1 < n; i = Child) + { + //子节点的位置 = 2 * (parent(父结点)) + 1 + Child = 2 * i + 1; + //得到子结点中较大的结点 + if(Child < n - 1 && a[Child + 1] > a[Child]){ + ++Child; + Compare++; + } + //如果较大的子结点大于父结点那么把较大的子结点往上移动 + //替换它的父结点 + if(a[i] < a[Child]) + { + temp = a[i]; + a[i] = a[Child]; + a[Child] = temp; + Move+=3; + }else{ + break; + } + } +} +//堆排序算法 +void HeapSort(int a[], int n) +{ + int i; + //调整序列的前半部分元素,调整完之后第一个元素 + //是序列的最大元素,n/2-1是最后一个非叶子结点 + for(i = n/2 - 1; i >= 0; --i){ + HeapAdjust(a, i, n); + } + for(i = n - 1; i > 0; --i) + { + a[i] = a[0]+a[i]; + a[0] = a[i]-a[0]; + a[i] = a[i]-a[0]; + Move+=3; + HeapAdjust(a,0,i);//递归调整 + } +} + +//归并排序 +void MergeArray(int a[], int first, int mid, int last, int temp[]) +{ + int i = first, j = mid + 1; + int m = mid, n = last; + int k = 0; + while(i <= m && j <=n ) + { + if(a[i] <= a[j]){ + Compare++; + temp[k++] = a[i++]; + } + else{ + Compare++; + temp[k++] = a[j++]; + } + } + while(i <= m) + { + temp[k++] = a[i++]; + } + while(j <= n) + { + temp[k++] = a[j++]; + } + for(i = 0; i < k; i++) + { + a[first + i] = temp[i]; + Move++; + } +} +void MergeSort(int a[], int first, int last, int temp[]) +{ + if(first < last) + { + int mid = (first + last) / 2; + MergeSort(a, first, mid, temp);//左边有序 + MergeSort(a, mid + 1, last, temp);//右边有序 + MergeArray(a, first, mid, last, temp);//再将二个有序数列合并 + } +} + +Bool MergeSort(int a[], int n) +{ + int *p = (int *)malloc(sizeof(int)*MAXSIZE); + if(p == NULL){ + return FALSE; + } + MergeSort(a, 0, n - 1, p); + return TRUE; +} + +void printSort(int a[]) +{ + for(int i = 0; i < MAXSIZE; i++) + { + printf("%d ", a[i]); + } + printf("\n"); +} + +int main() +{ + int a[MAXSIZE], *b; + srand((int)time(NULL)); + for(int i = 0; i < MAXSIZE; i++){ + + a[i] = rand()%101 + 5*i; + } + b = (int *)malloc(sizeof(int)*MAXSIZE); + int move = 0; + int compare = 0; + + //test1 + b = Fresh(a); + printf("InsertSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + InsertSort( b, MAXSIZE ); + printSort(b); + + //test2 + b = Fresh(a); + printf("\nShellSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + ShellSort( b, MAXSIZE ); + printSort(b); + + //test3 + b = Fresh(a); + printf("\nBubbleSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + BubbleSort( b, MAXSIZE ); + printSort(b); + + //test4 + b = Fresh(a); + printf("\nQuickSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + QuickSort( b, 0, MAXSIZE-1); + printf("move = %d, compare = %d, total = %d\n", Move, Compare, Move+Compare); + printSort(b); + + //test5 + b = Fresh(a); + printf("\nSelectSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + SelectSort( b, MAXSIZE ); + printSort(b); + + //test6 + b = Fresh(a); + Move = 0; + Compare = 0; + printf("\nHeapSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + HeapSort( b, MAXSIZE ); + printf("move = %d, compare = %d, total = %d\n", Move, Compare, Move+Compare); + printSort(b); + + //test7 + b = Fresh(a); + Move = 0; + Compare = 0; + printf("\nMergeSort:\n"); + printf("Before sorted:\n"); + printSort(b); + printf("After sorted:\n"); + + if(MergeSort( b, MAXSIZE )){ + printf("move = %d, compare = %d, total = %d\n", Move, Compare, Move+Compare); + printSort(b); + } + + + return 0; +} \ No newline at end of file diff --git "a/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.h" "b/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.h" new file mode 100644 index 00000000..8d3aed2c --- /dev/null +++ "b/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/Sort.h" @@ -0,0 +1,41 @@ +#include +#include +#include + +FILE *fpo; + +#define MAXSIZE 20 +typedef enum{ + FALSE, + TRUE +}Bool; + +//ˢ +int *Fresh(int a[]); + +//ֱӲ +void InsertSort( int a[], int n ); + +//ϣ +void ShellSort( int a[], int n ); + +// +void BubbleSort( int a[], int n ); + +// +void QuickSort( int a[], int l, int r ); + +//ѡ +void SelectSort( int a[], int n ); + +// +void HeapAdjust(int a[], int i, int n); +void HeapSort( int a[], int n ); + +//鲢 +void MergeArray( int a[], int first, int mid, int last, int temp[]); +void MergeSort(int a[], int first, int last, int temp[]); +Bool MergeSort(int a[], int n); + +// +void printSort(int a[]); \ No newline at end of file diff --git "a/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/\350\277\220\350\241\214\347\273\223\346\236\2341.png" "b/2017-1/NarthilZYX/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232\344\270\203\347\247\215\346\216\222\345\272\217/\350\277\220\350\241\214\347\273\223\346\236\2341.png" new file mode 100644 index 0000000000000000000000000000000000000000..58daef3cb94478543ddd657a8e57b0faafb5b427 GIT binary patch literal 18109 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 I_@~eQ9jj-H*Z=?k literal 0 HcmV?d00001 From 29779b594cdae701967749ec5e98554aab86cca4 Mon Sep 17 00:00:00 2001 From: FukurouNarthil Date: Fri, 16 Jun 2017 15:02:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=BC=80=E6=94=BE=E5=AE=9A=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Hash.c" | 176 ++++++++++++++++++ .../Hash.h" | 59 ++++++ 2 files changed, 235 insertions(+) create mode 100644 "2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.c" create mode 100644 "2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.h" diff --git "a/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.c" "b/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.c" new file mode 100644 index 00000000..4a3c2d40 --- /dev/null +++ "b/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.c" @@ -0,0 +1,176 @@ +#include "Hash.h" + +//жϺ +Bool isPrime( int num ) +{ + for (int i = 2; i < num; ++i) { + if (num % i == 0) + return False; + } + return True; +} +//ȡ +int getPrime( HashTable h ) +{ + int p = h.sizeindex; + if(p==1) + return 1; + while(!isPrime(p--)); + return p+1; +} + +//ϣǷΪռǷжϺ +Bool isEmpty( HashTable h ) +{ + if(h.count == 0) + return True; + return False; +} +Bool isFull ( HashTable h ) +{ + if(h.count == h.sizeindex) + return True; + return False; +} + +//½ϣ +HashTable createHashTable( int sizeindex ) +{ + HashTable temp; + temp.count = 0; + temp.sizeindex = sizeindex; + temp.elem = (ElemType *)malloc(sizeindex * sizeof(ElemType)); + for( int i = 0; i < sizeindex; i++) + { + temp.elem[i].key = EMPTYKEY; + temp.elem[i].val = EMPTYVALUE; + } + return temp; +} +ElemType newElemType( KeyType key, ValueType value ) +{ + ElemType temp; + temp.key = key; + temp.val = value; + return temp; +} +//ؽϣ +HashTable rebuildHashTable( HashTable h ) +{ + int sizeindex = 2 * h.sizeindex; + HashTable temp = createHashTable( sizeindex ); + for( int i = 0; i < sizeindex; i++) + { + if(h.elem[i].key != EMPTYKEY && h.elem[i].key != NULLKEY) + InsertHT(temp, h.elem[i]); + } + free(h.elem); + return temp; +} + +Status SearchHashTable( HashTable h,KeyType k ){ + //ڿŶַϣhaвҹؼΪkԪأҳɹ + //pָʾԪڱλãOKp + //ָʾλãERRORcollisionԼƳͻֵ㣬ʱο + int i = 0; + int p = getPrime(h); + int pos = k % p; + int collision = 0; + while (h.elem[i].key!=NULLKEY && h.elem[pos].key!=k) + //λм¼ҹؼֲ + { + i++; //̽鷨һַ + collision++; + ++pos; + pos = pos % h.sizeindex; + } + if(collision) + printf("ڳͻ %d ֮", collision); + printf(" %d ҵؼ %d \n", pos, k); + return OK; +} + +//ɾϣйؼk +int DeleteHT(HashTable ha, ElemType elem){ + int p = getPrime(ha); + int pos = elem.key %p; + int collision = 0; + while(ha.elem[pos].key != elem.key) + { + collision++; + ++pos; + pos = pos % ha.sizeindex; + } + ha.elem[pos] = newElemType(DELKEY, DELVAL); + ha.count -= 1; + if(collision) + printf("ڳͻ %d ֮", collision); + printf(" %d ҵԪ{ %d ->%d }ɾ %d \n", pos, elem.key, elem.val); + return OK; +} + +//ؼk뵽ϣ +void InsertHT(HashTable ha, ElemType k ){ + int i; + int p = getPrime(ha); + int pos = k.key % p; + int collision = 0; + if (ha.elem[pos].key==NULLKEY || ha.elem[pos].key==DELKEY) //x[j]ֱӷڹϣ + { + ha.elem[pos] = k; + ha.count+=1; + } + else //ͻʱ,̽鷨ͻ + { + i=1; //i¼x[j]ͻĴ + do + { + pos = (pos+1)%p; + i++; + } while (ha.elem[pos].key!=NULLKEY && ha.elem[pos].key!=DELKEY); + ha.elem[pos]=k; + ha.count+=1; + collision++; + } + if (collision) { + printf("ͻ %d κ,", collision); + } + printf(" %d λòԪ{ %d -> %d} \n", pos, k.key, k.val ); +} + +//ϣ +void printHashTable(HashTable ha){ + for (int i = 0; i < ha.sizeindex; ++i) { + printf("{ [%d] : %d->%d }\n", i, ha.elem[i].key, ha.elem[i].val); + } +} + + +int main() +{ + srand(time(NULL)); + HashTable ha = createHashTable(10); + + ElemType* testInputs; + testInputs = (ElemType *)malloc(6 * sizeof(ElemType)); + for(int i = 0; i < 6; i++) + { + testInputs[i] = newElemType(rand() % 100, rand() % 100); + } + + for (int i = 0; i < 6; ++i) { + InsertHT(ha,testInputs[i]); + } + printHashTable(ha); + + printf("ң\n"); + for (int i = 0; i < 6/2; ++i) { + SearchHashTable(ha, testInputs[rand()%6].key); + } + for (int i = 0; i < 6/2; ++i) { + SearchHashTable(ha,rand()%100); + } + + ha = rebuildHashTable(ha); + printHashTable(ha); +} \ No newline at end of file diff --git "a/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.h" "b/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.h" new file mode 100644 index 00000000..633f6ff5 --- /dev/null +++ "b/2017-1/NarthilZYX/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232\345\274\200\346\224\276\345\256\232\345\235\200/Hash.h" @@ -0,0 +1,59 @@ +#include +#include +#include +typedef enum{ + ERROR, + OK +}Status; +typedef enum{ + False, + True +}Bool; +#define NULLKEY -1 //չؼֵ +#define DELKEY -2 //屻ɾؼֵ +#define DELVAL -2 +#define EMPTYKEY 0 +#define EMPTYVALUE 0 +typedef int KeyType; +typedef int ValueType; +typedef struct _ElemType { + KeyType key; // ؼ + ValueType val; // ֵ +#ifdef CHAINED_HASH + struct _ElemType *next; +#endif +} ElemType; + +#define MaxSize 100 //ϣ +int hashsize[10] = {13, 19, 29, 41, 59, 79, 107, 149, 197, 263 }; +typedef struct { + ElemType *elem;//Ԫش洢ַ̬ڴ + int count;//ѱʹõݵĸ + int sizeindex;//ܸ +}HashTable; + +//жϺд +Bool isPrime( int num ); +//ȡ +int getPrime( HashTable h ); + +//ϣǷΪռǷжϺд +Bool isEmpty( HashTable h ); +Bool isFull ( HashTable h ); + +//½ϣݣд +HashTable newHashTable( int sizeindex ); +ElemType newElemType( KeyType key, ValueType value ); +//ؽϣ +HashTable rebuildHashTable( HashTable h ); + +Status SearchHashTable( HashTable ha,KeyType k ); + +//ɾϣйؼk +int DeleteHT(HashTable ha, ElemType elem); + +//ؼk뵽ϣ +void InsertHT(HashTable ha, ElemType elem); + +//ϣ +void printHashTable(HashTable ha); \ No newline at end of file