diff --git "a/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.c" "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.c" new file mode 100644 index 00000000..1b751f23 --- /dev/null +++ "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.c" @@ -0,0 +1,137 @@ +#include"Sort.h" +void Print(RecordType r[], int length) +{ + for (int i = 1; i <= length; i++) + { + printf("%d ", r[i]); + } + printf("\n"); +} +void InsSort(RecordType r[], int length,int *CpNumber,int *MovNumber) +{ + *CpNumber = 0;//比较次数 + *MovNumber = 0;//移动次数 + int i, j; + for ( i = 2; i <=length; i++) { + r[0] = r[i]; /* 将待插入记录存放到临时变量中 */ + (*MovNumber)++; + j = i - 1; /* 最近一次排序结束的边界位置 */ + while ((++(*CpNumber))&&(r[0] < r[j])) { /* 寻找插入位置 */ + r[j + 1] = r[j]; /* 从小到大排序,大元素右移 */ + (*MovNumber)++; + j = j - 1; /* 待插入元素与已排序区下一个(左移一位)元素继续进行比较 */ + } + r[j + 1] = r[0]; /* 将待插入记录插入到已排序的序列中 */ + (*MovNumber)++; + } + Print(r, length); +} +void ShellInsert(RecordType r[], int length, int delta,int *CpNumber, int *MovNumber) { + int i,j; + *CpNumber = 0; + *MovNumber = 0; + for (i = 1 + delta; i <= length; i++) { /* 1+delta为第一个子序列的第二个元素的下标 */ + if ((++(*CpNumber))&&(r[i] < r[i - delta])) { + r[0] = r[i]; /* 备份r[i] (不做监视哨) */ + for (j = i - delta; j > 0 &&(++*(CpNumber))&& r[0] < r[j] ; j -= delta) { + r[j + delta] = r[j]; + (*MovNumber)++; + } + r[j + delta] = r[0]; + } + } +} + +/* 对记录数组r做希尔排序, length为数组的长度*/ +void ShellSort(RecordType r[], int length,int *CpNumber, int *MovNumber) { + int d = length / 2; + while (d >= 1) { + ShellInsert(r, length, d,CpNumber,MovNumber); + d = d / 2; + } + Print(r, length); +} + +void Copy(RecordType a[], RecordType b[], int c) +{ + for (int i = 0; i <= c; i++) + { + a[i] = b[i]; + } +} + +void BubbleSort(RecordType r[], int length,int *c,int *m) { + *c = 0; *m = 0; + int n = length,i,j,x; + int change = 1;//TRUE + for (i = 1; i <= n - 1 && change; ++i) { + change = 0;//FALSE + for (j = 1; j <= n - i; ++j) { + if ((++(*c))&&r[j] > r[j + 1]) { + x = r[j]; + r[j] = r[j + 1]; + r[j + 1] = x; + (*m)++; + change = 1; + } + } + } + Print(r, length); +} + +int QKPass(RecordType r[], int left, int right, int *c, int *m) { + int x = r[left]; /* 选择基准记录*/ + int low = left; + int high = right; + while (low < high) { + while (low < high &&(++(*c))&& r[high] >= x) { /* high从右到左找小于x.key的记录 */ + high--; + } + r[low] = r[high]; /* 找到小于x.key的记录,则进行交换 */ + ++(*m); + while (low < high && (++(*c)) && r[low] < x) { /* low从左到右找不小于x.key的记录 */ + low++; + } + r[high] = r[low]; /* 找到不小于x.key的记录,则交换*/ + ++(*m); + } + + r[low] = x; /* 将基准记录保存到low=high的位置 */ + ++(*m); + return low; /*返回基准记录的位置*/ +} + +void QKSort(RecordType r[], int low, int high,int *c,int *m) { + if (low < high) { + int pivot = QKPass(r, low, high,c,m); + QKSort(r, low, pivot - 1,c,m); + QKSort(r, pivot + 1, high,c,m); + } +} + +void SelectSort(RecordType r[], int length, int *c, int *m) +{ + *c = 0; *m = 0; + int n = length; + int i,k,j; + for (i = 1; i <= n-1; ++i) { + k = i; + for (j = i + 1; j <= n; ++j) { + if ((++(*c))&&r[j] < r[k]) { + k = j; + } + } + + if (k != i) { + int x = r[i]; + r[i] = r[k]; + r[k] = x; + (*m)++; + } + } + Print(r, 10); +} + + + + diff --git "a/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.h" "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.h" new file mode 100644 index 00000000..cb494218 --- /dev/null +++ "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/Sort.h" @@ -0,0 +1,12 @@ +#include +#include +#include +typedef int RecordType; +void Print(RecordType r[], int length); +void InsSort(RecordType r[], int length,int *a,int *b); +void ShellInsert(RecordType r[], int length, int delta,int *,int *); +void ShellSort(RecordType r[], int length,int *,int *); +void Copy(RecordType a[], RecordType b[], int c); +void BubbleSort(RecordType r[], int length, int *, int *); +void QKSort(RecordType r[], int low, int high,int *,int *); +void SelectSort(RecordType r[], int length, int *, int *); diff --git "a/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text1.png" "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text1.png" new file mode 100644 index 00000000..5f059913 Binary files /dev/null and "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text1.png" differ diff --git "a/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text2.png" "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text2.png" new file mode 100644 index 00000000..82939907 Binary files /dev/null and "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/text2.png" differ diff --git "a/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/\346\272\220.c" "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/\346\272\220.c" new file mode 100644 index 00000000..ef68cfb5 --- /dev/null +++ "b/2017-1/Sv/\344\272\224\347\247\215\346\216\222\345\272\217/\346\272\220.c" @@ -0,0 +1,47 @@ +#include"Sort.h" +int main() +{ + RecordType r[11]; + RecordType temp[11]; + srand(time(0)); + temp[0] = 0; + for (int i = 1; i < 11; i++) + { + temp[i] = rand() % 100; + } + int a, b; + int *CpNumber, *MovNumber; + CpNumber = &a; MovNumber = &b; + printf("序列:\n"); + Print(temp, 10); + Copy(r, temp,10); + printf("\n插入排序:\n"); + InsSort(r, 10,CpNumber,MovNumber); + printf("比较次数:%d,移动次数:%d\n\n", (*CpNumber), (*MovNumber)); + Copy(r, temp, 10); + printf("希尔排序:\n"); + ShellSort(r, 10, CpNumber, MovNumber); + printf("比较次数:%d,移动次数:%d\n\n", (*CpNumber), (*MovNumber)); + Copy(r, temp, 10); + printf("冒泡排序:\n"); + BubbleSort(r, 10, CpNumber, MovNumber); + printf("比较次数:%d,移动次数:%d\n\n", (*CpNumber), (*MovNumber)); + Copy(r, temp, 10); + *CpNumber = 0; *MovNumber = 0; + printf("快速排序:\n"); + QKSort(r, 1, 10, CpNumber, MovNumber); + Print(r, 10); + printf("比较次数:%d,移动次数:%d\n\n", (*CpNumber), (*MovNumber)); + Copy(r, temp, 10); + printf("简单选择排序:\n"); + SelectSort(r, 10, CpNumber, MovNumber); + printf("比较次数:%d,移动次数:%d\n\n", (*CpNumber), (*MovNumber)); + + + + + + + + +} \ No newline at end of file diff --git "a/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.c" "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.c" new file mode 100644 index 00000000..dd3547d9 --- /dev/null +++ "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.c" @@ -0,0 +1,102 @@ +#include"OHash.h" +bool isSushu(int a) +{ + for (int i = 2; i < sqrt(a)+2; i++) + + { + if (a%i == 0)return false; + } + return true; +} +int hashsize(int size) +{ + int p = size; + if (p == 1)return 1; + while (!isSushu(p--));//从size开始往下的遇到的第一个素数,此处借鉴钟总 + return p + 1; +} +int Hash(KeyType K, int size) +{ + int p = hashsize(size); + return K%p; +} +bool EQ(int a, int b) { return(a == b); } +void collision(int *p, int *c){ (*p)++ ; (*c)++; } + +HashTable NewHashTable(int size) +{ + HashTable temp; + temp.count = 0; + temp.sizeindex = size; + temp.elem = (ElemType*)malloc(size * sizeof(ElemType)); + for (int i = 0; i < size; i++) + { + temp.elem[i].key = -1; + temp.elem[i].val = 0; + } + return temp; +} +void RecreateHashTable(HashTable *H) +{ + HashTable temp = NewHashTable(H->sizeindex * 2); + int a = H->sizeindex; + for (int i = 0; i elem[i]; + } + H->sizeindex *= 2; + H->elem= (ElemType*)malloc(H->sizeindex * sizeof(ElemType)); + for (int i = 0; i < H->sizeindex; i++) + { + H->elem[i].key = -1; H->elem[i].val = 0; + } + for (int i = 0; i < a; i++) + { + int p = Hash(temp.elem[i].key, H->sizeindex); + H->elem[p] = temp.elem[i]; + } +} +Status SearchHash(HashTable H, KeyType K, int *p, int *c) +{ + *p = Hash(K,H.sizeindex); // 求得哈希地址 + while (H.elem[*p].key != NULLKEY && !EQ(K, H.elem[*p].key)) { + collision(p, c); //冲突,求得下一探查地址 p + //printf("***"); + } + + if (EQ(K, H.elem[*p].key)) { // 查找成功,p返回待查数据元素位置 + return SUCCESS; + } + else { + return FAILED; // 查找不成功 + } +} +Status InsertHash(HashTable &H, ElemType e) +{ + // 查找不成功时插入数据元素e到开放地址哈希表H中,并返回OK + // 若冲突次数过大,则重建哈希表 + int a = 0,b=0; + int *c ;//用于记录冲突次数 + c = &a; + int *p ; + p = &b; + if (SearchHash(H, e.key, p, c) == SUCCESS) { // 表中已有与 e 有相同关键字的元素 + if ((*c) != 0) + { + printf("\n哈希冲突!次数:%d,关键字值:%d->%d\n", *c, e.key, e.val); + } + return DUPLICATE; + } + + else if (*c < hashsize(H.sizeindex) / 2) { + // 冲突次数 c 未达到上限,(阀值可调,此处仅为示例) + H.elem[*p] = e; + ++H.count; + return OK; + } + else { + // 重建哈希表,极端情况下可能哈希表“已满”。 + // 所以通常的重建过程都是先增大新哈希表的容量 + RecreateHashTable(&H); + } +} \ No newline at end of file diff --git "a/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.h" "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.h" new file mode 100644 index 00000000..215e8a2c --- /dev/null +++ "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/OHash.h" @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#define NULLKEY -1 +//----------------------------------- +typedef int KeyType; +typedef int ValueType; +typedef struct _ElemType { + KeyType key; // 关键字 + ValueType val; // 值 +#ifdef CHAINED_HASH + struct _ElemType *next; +#endif +} ElemType; +typedef struct _bool{ true,false }bool; +typedef struct { + ElemType *elem;//地址 + int count; // 当前数据元素个数 + int sizeindex; // hashsize[sizeindex]为当前容量 +} HashTable; +typedef enum _status +{ + SUCCESS, FAILED, DUPLICATE,OK +}Status; +//----------------------------------- +bool EQ(int, int); +bool isSushu(int a);//判断是否为素数 +int hashsize(int size); +void RecreateHashTable(HashTable *H); +Status SearchHash(HashTable H, KeyType K, int *p, int *c);//哈希表中查找关键值为K的记录,c记录次数,p返回地址 +int Hash(KeyType,int size); +Status InsertHash(HashTable &H, ElemType e); +HashTable NewHashTable(int size); + + + + + + diff --git "a/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text1.png" "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text1.png" new file mode 100644 index 00000000..cbc8b725 Binary files /dev/null and "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text1.png" differ diff --git "a/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text2.png" "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text2.png" new file mode 100644 index 00000000..245d1958 Binary files /dev/null and "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/text2.png" differ diff --git "a/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/\346\272\220.c" "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/\346\272\220.c" new file mode 100644 index 00000000..192932e3 --- /dev/null +++ "b/2017-1/Sv/\345\223\210\345\270\214\350\241\250\345\273\272\347\253\213\346\237\245\346\211\276\357\274\210\347\272\277\346\200\247\350\247\243\345\206\263\345\206\262\347\252\201\357\274\211/\346\272\220.c" @@ -0,0 +1,54 @@ +#include"OHash.h" + +int main() +{ + int SIZE = 30; + HashTable HA = NewHashTable(SIZE); + srand(time(0)); + printf("插入20个元素:\n"); + ElemType array[20]; + for (int i = 0; i < 20; i++) + { + ElemType e; + e.key = rand() % 1000 + 1; + e.val = rand() % 1000 + 1; + array[i] = e; + InsertHash(HA, e); + } + + for (int i = 0; i < HA.sizeindex; i++) + { + printf("{ [%d] : %d -> %d }\t", i, HA.elem[i].key, HA.elem[i].val); + } + for (int i = 0; i < 3; i++) + { + ElemType temp = array[rand() % 20]; + int p,c; + if (SearchHash(HA, temp.key, &p, &c) == SUCCESS) + { + printf("查找关键字为%d,地址:%d\n", temp.key, p); + } + } + for (int i = 0; i < 3; i++) + { + ElemType temp; + temp.key = rand() % 1000 + 1; + temp.val = rand() % 1000 + 1; + int p, c; + if (SearchHash(HA, temp.key, &p, &c) == SUCCESS) + { + printf("查找关键字为%d,地址:%d\n", temp.key, p); + } + else + { + printf("查找关键字为%d,查找失败!\n", temp.key); + } + } + printf("\n重建哈希表:\n"); + RecreateHashTable(&HA); + for (int i = 0; i < HA.sizeindex; i++) + { + printf("{ [%d] : %d -> %d }\t", i, HA.elem[i].key, HA.elem[i].val); + } + +} \ No newline at end of file