diff --git "a/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/QQ\345\233\276\347\211\20720170616104658.png" "b/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/QQ\345\233\276\347\211\20720170616104658.png" new file mode 100644 index 00000000..045cf2f2 Binary files /dev/null and "b/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/QQ\345\233\276\347\211\20720170616104658.png" differ diff --git "a/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/S-homework.c" "b/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/S-homework.c" new file mode 100644 index 00000000..5938e926 --- /dev/null +++ "b/2017-1/PWHL/\345\223\210\345\270\214\350\241\250/S-homework.c" @@ -0,0 +1,224 @@ +//参考jackcily代码 + +#include "S-homework.h" +status make(int **q, int l) +{ + int temp; + int length; + int i; + length = l; + //(*q) = (int*)malloc(sizeof(int)*l); + for (i = 0; i elem = (ElemType*)malloc(m * sizeof(ElemType)); + if (!(*H).elem) + { + exit(0);// 存储分配失败 + } + for (i = 0; i < (*H).sizeindex; i++) + { + (*H).elem[i].key = -1; // 未填的标注为-1 + (*H).elem[i].val = 0; + } + hashsize_count= hashsize_count+1; + return 1; +} +//进行插入操作 +status InsertHash(HashTable *h, KeyType e, ValueType v) +{ + int c = 0;//用于计数冲突次数 + int p;//用于返回插入的位置 + if (SearchHash(*h, e, v, &p, &c)) + { + return DUPLICATE;//如果已有该元素则返回 + } + else if (c < h->sizeindex / 2)//冲突次数达到则进行扩表 c的值可调 + { + (*h).elem[p].val = v; + (*h).elem[p].key = e; + ++(*h).count; + return SUCCESS;//插入成功 + } + else + {//如果哈希表过于小 + printf("哈希表分配过小 重建表\n"); + RecreateHashTable(h); + return UNSUCCESS; + } +} +status SearchHash(HashTable h, KeyType e, ValueType v, int* p, int *c) +{ + //如果查找成功 p为所在的下标 否则p为待插入的位置 + *p = hash(e, h.sizeindex);//返回下标 + while (h.elem[*p].key != -1 && v != h.elem[*p].val) + { + (*c)++; + if ((*c) < h.sizeindex) + {//如果冲突次数还能继续处理 + collision(p, *c, e, h.sizeindex); + } + else + { + break; + } + } + if (v == h.elem[*p].val) + { + return SUCCESS; + } + else + { + return UNSUCCESS; + } +} +int hash(KeyType e, int l) +{//除留余数法构造简单的哈希表 + int i = e % l; + return i; +} +void collision(int *p, int c, KeyType k, int l) +{ + *p = (k + c) % l;//线性探索再散列:di = 1,2,3,...,m-1 +} +void TraverHash(HashTable h) +{ + int i; + for (i = 0; i < h.sizeindex; i++) + { + printf("{[%d] : ", i); + printf("%d->%d} ", h.elem[i].key, h.elem[i].val); + } + printf("\n"); +} +//重建哈希表 +status RecreateHashTable(HashTable *H) +{ + int i; + int count = (*H).sizeindex;//H中原有记录个数 + ElemType *p; + ElemType *elem = (ElemType *)malloc(count * sizeof(ElemType));//动态生成存放哈希表H原有数据的空间 + p = elem; + for (i = 0; i < (*H).sizeindex; ++i) + { + //将原有的所有记录,保存到elem中 + p[i].key = (*H).elem[i].key; + p[i].val = (*H).elem[i].val; + } + (*H).count = 0;//将原有记录数置为0,为下面调用InserHash做准备 + (*H).sizeindex = hashsize[hashsize_count]; + (*H).elem = (ElemType *)realloc((*H).elem, (*H).sizeindex * sizeof(ElemType));//以新的存储容量重新生成空哈希表H + for (i = 0; i <(*H).sizeindex; ++i) + { + //初始化新的哈希表 + (*H).elem[i].key = -1;//未填记录 + (*H).elem[i].val = 0; + } + for (i = 0; i +#include +#include +#include +#define init_num 9 +#define search_num 6 +#define SUCCESS 1 +#define UNSUCCESS 0 +#define DUPLICATE -1 +typedef int status; +typedef int KeyType; +typedef int ValueType; +typedef struct _ElemType +{ + KeyType key; // 关键字 + ValueType val; // 值 + #ifdef CHAINED_HASH + struct _ElemType *next; + #endif +} ElemType; +typedef struct +{ + ElemType *elem; + int count;//当前元素个数 + int sizeindex;//哈希表表长 +}HashTable; +static int m;//内部链接静态变量,m为哈希表表长 +static int hashsize[] = { 11,19,29,37,49 };//内部链接静态变量,哈希表容量(表长m)递增表,一个合适的素数序列。 +int hashsize_count = 0; +int hash(KeyType e, int l);//进行寻址 +void collision(int *p, int c, KeyType k, int l);//下一个搜寻的位置确定 +status RecreateHashTable(HashTable *H);//重建哈希表 +status InsertHash(HashTable *H, KeyType e, ValueType v);//进行插入操作 +status SearchHash(HashTable H, KeyType e, ValueType v, int* p, int *c);//进行查找操作 +void TraverHash(HashTable H); +status InitHashTable(HashTable *H); +void travel(int *q, int l); \ No newline at end of file diff --git "a/2017-1/PWHL/\346\216\222\345\272\217/QQ\345\233\276\347\211\20720170607100413.png" "b/2017-1/PWHL/\346\216\222\345\272\217/QQ\345\233\276\347\211\20720170607100413.png" new file mode 100644 index 00000000..54fb24c8 Binary files /dev/null and "b/2017-1/PWHL/\346\216\222\345\272\217/QQ\345\233\276\347\211\20720170607100413.png" differ diff --git "a/2017-1/PWHL/\346\216\222\345\272\217/hello.c" "b/2017-1/PWHL/\346\216\222\345\272\217/hello.c" new file mode 100644 index 00000000..3801ad8d --- /dev/null +++ "b/2017-1/PWHL/\346\216\222\345\272\217/hello.c" @@ -0,0 +1,239 @@ +锘#include "hello.h" +void copy(int *a, int *b, int n) +{ + for (int i = 0; i < n; i++) + { + a[i] = b[i]; + } +} +void print(int *p, int n, int sum1, int sum2)//鎵撳嵃鏁扮粍 +{ + int i; + if (sum1 != 0 && sum2 != 0) + { + printf("\n鎬荤殑姣旇緝娆℃暟 %d\n", sum1); + printf("\n鎬荤殑绉诲姩娆℃暟 %d\n", sum2); + printf("\n浜岃呮鏁颁箣鍜屼负 %d\n", sum1 + sum2); + printf("\n鎵撳嵃鎺掑簭鍚庣殑鏁扮粍\n"); + } + for (i = 0; i < n; i++) + { + printf("%d ", p[i]); + } + printf("\n"); +} +int Make(int *p)//闅忔満鐢熸垚鏁扮粍 +{ + int i, temp; + int n; + do + { + temp = rand() % 20 + 1; + } while (temp <= 0); + n = temp; + for (i = 0; i < n; i++) + { + do + { + temp = rand() % 100 + 1; + } while (temp <= 0); + p[i] = temp; + } + return n; +} +//鍐掓场鎺掑簭 +void BubbleSort(int *p, int n) +{ + int i, j; + int temp; + int sum1 = 0; + int sum2 = 0; + for (i = 0; i < n; i++) + { + for (j = 0; (++sum1) && j < n - 1; j++) //姣旇緝,鎵惧嚭鏈稛鏈灏忓叧閿瓧鐨勮褰 + if (p[j] < p[j + 1]) + { + temp = p[j]; //R[j]涓嶳[j-1]杩涜浜ゆ崲,灏嗘渶灏忓叧閿瓧璁板綍鍓嶇Щ + p[j] = p[j + 1]; + p[j + 1] = temp; + sum2 = sum2 + 3; + } + } + printf("\n"); + printf("鍐掓场鎺掑簭\n"); + print(p, n, sum1, sum2); + printf("\n\n"); +} +//鐩存帴鎻掑叆鎺掑簭 +void insertSort(int *p, int n) +{ + int i, j; + int sum1 = 0;//鎬绘瘮杈冩鏁 + int sum2 = 0;//鎬荤Щ鍔ㄦ鏁 + int temp; + for (i = 1; i < n; i++) + { + + if ((++sum1) && p[i] > p[i - 1]) + { + temp = p[i]; + for (j = i - 1; (sum1++), temp>p[i], j >= 0; j--) + { + p[j + 1] = p[j]; + sum2++; + } + p[j + 1] = temp; + } + } + printf("\n"); + printf("鐩存帴鎻掑叆鎺掑簭\n"); + print(p, n, sum1, sum2); + printf("\n\n"); +} +void ShellInsert(int *q, int d, int *sum1, int *sum2, int n) +{//瀵归『搴忚〃杩涜涓瓒熷笇灏 浣嶇疆澧為噺鍙樻垚 dk 鑰屼笉鏄1 + //q[0] 鍙槸鏆傚瓨鍗曞厓 涓嶆槸鍝ㄥ叺 褰搄<=0 鏃 鎻掑叆浣嶇疆宸茬粡鎵惧埌 + int i, j; + int temp; + for (i = d; i < n; i++) + { + if ((++(*sum1)) && q[i] >q[i - d]) + { + temp = q[i]; + (*sum1)++; + for (j = i - d; (++(*sum1)) && temp > q[j] && j >= 0; j -= d) + { + q[j + d] = q[j]; + (*sum2)++; + } + q[j + d] = temp; + } + } +} +//甯屽皵鎺掑簭 +void ShellSort(int *p, int n) //甯屽皵鎺掑簭绠楁硶 +{ + int i; + int temp; + int sum1 = 0; + int sum2 = 0; + i = (n - 1) / 2; + for (i = n / 2; i > 0; i = i / 2) //瀵规墍鏈夌浉闅攇ap浣嶇疆鐨勬墍鏈夊厓绱犵粍杩涜鎺掑簭 + { + + ShellInsert(p, i, &sum1, &sum2, n); + } + printf("\n"); + printf("甯屽皵鎺掑簭\n"); + print(p, n, sum1, sum2); + printf("\n\n"); +} + +//蹇熸帓搴 +int Partition(int *q, int n, int low, int high, int *sum1, int *sum2) +{ + int p;//鏋㈢航鍊 + p = q[low]; + while (low < high) + { + while (++(*sum1) && low < high&&q[high] <= p) + { + --high; + (*sum2)++; + } + q[low] = q[high]; + while (++(*sum1) && low < high && q[low] >= p) + { + ++low; + (*sum2)++; + } + q[high] = q[low]; + } + q[low] = p; + return low; +} +void QSort(int *q, int n, int low, int high, int *sum1, int *sum2) +{ + int p; + if (low < high) + { + p = Partition(q, n, low, high, sum1, sum2); + QSort(q, n, low, p - 1, sum1, sum2); + QSort(q, n, p + 1, high, sum1, sum2); + } +} +void QuickSort(int *q, int n) +{ + int sum1 = 0; + int sum2 = 0; + QSort(q, n, 0, n - 1, &sum1, &sum2); + printf("\n"); + printf("蹇熸帓搴廫n"); + print(q, n, sum1, sum2); + printf("\n\n"); +} + +int change(int *q, int n, int low, int high) +{ + int p; + p = q[low];//鏋㈣酱鍊 + while (low < high) + { + while (low < high && q[high] <= p) + { + high--; + } + q[low] = q[high]; + while (low < high && q[low] >= p) + { + low++; + } + q[high] = q[low]; + } + q[low] = p; +} +void SelectSort(int *p, int n)//绠鍗曢夋嫨鎺掑簭 +{ + int i, j; + int temp; + int sum1 = 0; + int sum2 = 0; + for (i = 0; i < n; i++) + { + for (j = i + 1; j < n; j++) + { + if ((++sum1) && p[i] < p[j]) + { + temp = p[i]; + p[i] = p[j]; + p[j] = temp; + sum2 = sum2 + 3; + } + } + } + printf("\n"); + printf("绠鍗曢夋嫨鎺掑簭\n"); + print(p, n, sum1, sum2); + printf("\n\n"); +} +int main() +{ + srand(time(0)); + int list[Maxsize]; + int list_copy[Maxsize]; + int length = Make(&list);//鍒堕犻渶瑕佹墦鍗扮殑鏁扮粍 骞惰繑鍥為暱 + printf("鎵撳嵃鍒濆鏁扮粍\n"); + print(list, length, 0, 0); + printf("\n\n"); + copy(list_copy, list, length); + insertSort(list_copy, length);//杩涜鐩存帴鎻掑叆 + copy(list_copy, list, length); + ShellSort(list_copy, length);//杩涜甯屽皵鎺掑簭 + copy(list_copy, list, length); + BubbleSort(list_copy, length);//杩涜璧锋场鎺掑簭 + copy(list_copy, list, length); + QuickSort(list_copy, length);//蹇熸帓搴 + copy(list_copy, list, length); + SelectSort(list_copy, length);//绠鍗曢夋嫨鎺掑簭 + return 0; +} diff --git "a/2017-1/PWHL/\346\216\222\345\272\217/hello.h" "b/2017-1/PWHL/\346\216\222\345\272\217/hello.h" new file mode 100644 index 00000000..21b7d34f --- /dev/null +++ "b/2017-1/PWHL/\346\216\222\345\272\217/hello.h" @@ -0,0 +1,18 @@ +//参考jackcily作业 +#include +#include +#include +#define Maxsize 25 +void copy(int *a, int *b, int n); +void print(int *p, int n, int sum1, int sum2);//打印数组 +int Make(int *p);//随机生成数组 +void insertSort(int *p, int n);//直接插入排序 +void ShellSort(int *p, int n); //希尔排序算法 +void ShellInsert(int *q, int d, int *sum1, int *sum2, int n); +void BubbleSort(int *p, int n);//冒泡排序 +int Partition(int *q, int n, int low, int high, int *sum1, int *sum2);//快速排序 +void QSort(int *q, int n, int low, int high, int *sum1, int *sum2);//快速排序 +void QuickSort(int *q, int n); +int change(int *q, int n, int low, int high); +void SelectSort(int *p, int n);//简单选择排序 +