1、作为一名徘徊在课设边缘不能自拔的编程学习者,思路很关键,因为编程思想并不是一朝一夕就能培养出来的,所以临阵磨枪,思路优先要达到排序的目的,首先要建立排序对象,要建立一个对象,就要确定他的数据元素结构以及存储方式,所以在看到题目后,大家应该有形如下图一样清晰的编程思路,先做什么,再做什么。
2、头文件应该懂得可以跳过本步
3、一,建立第一个结构体,应包含数据元素的各种数据项,比如,编号,销售额,销售量一类数据项,小编做了这样几个数据项。
4、建立第二个结构体,第二个结构体是为了确定存储结构,小编采用了顺序表,你也可以采用其他的方法。
5、初始化结构体,一般是数字的话呢直接复制就可以,如果是字符串的话呢,就要用到strcpy函数,自己拟定几个数据项一一赋值就可以了,一般我们会用一个函数吧他包裹起来,主函数直接调用,显得规范一些,当然了直接在主函数里赋值也是ok的。void SetData(SequenList &S){strcpy(S.r[1].num, "A001");strcpy(S.r[10].name,"脑白金");S.r[1].price = 9.8;S.r[1].count = 1056;S.r[1].sale = S.r[1].price*(double)S.r[1].count;}这是第一个,同样输入,一般输入5,6个就够调试了
6、做一个输出函数一般用for循环就ok了很简单的\t是空格的意思
7、int Partit坡纠课柩ion(SequenList &L,int low,int high)//快排法,关键字为count{ L.r[0] = L.r[low];//设r[0]为哨兵,储存第一个关键字,low和high指向表的两头 int pivotkey = L.r[low].count;//用pivotkey存储第一个关键字 DataType q; while (low<high)//当头和尾还没有相遇时 { while (low < high&&L.r[high].count >= pivotkey)//当头尾未相遇且表尾所指元素大于等于表头时 --high;// 尾指针前移 q = L.r[low];//保存第一个元素 L.r[low] = L.r[high];//用表尾元素覆盖表头 L.r[high] = q;//将预先保存的表头赋值给表尾 while (low < high&&L.r[low].count <= pivotkey)//当表头表尾未相遇且表尾所指元素大于等于表头时 ++low;//表头后移 q = L.r[low];//保存第一个元素 L.r[low] = L.r[high];//用表尾元素覆盖表头 L.r[high] = q;//将预先保存的表头赋值给表尾 } cout << endl; return low;//返回表头指针}void QSort(SequenList &L, int low, int high){ int pivotloc; if (low < high) { pivotloc = Partition(L, low, high); QSort(L, low, pivotloc - 1); QSort(L, pivotloc + 1, high); }}
8、void PopSort(SequenList &L)//冒泡排序法{ DataType q; for (int i = 1; i <= L.length; ++i)//退位继续排序 { for (int j = 1; j <= L.length-1; ++j)//j位和他的下一位做比较,所以length-1 { if (L.r[j].price>L.r[j + 1].price) { q = L.r[j]; L.r[j] = L.r[j + 1];//两者换位 L.r[j + 1] = q; } } }}
9、void HeapAdjust(SequenList &H,int s,int m)//堆排序{ DataType rc = H.r[s]; for (int j = 2 * s-1; j < m; j *= 2) { if (j < m&&H.r[j].sale<H.r[j + 1].sale) ++j; if (rc.sale > H.r[j].sale) break; H.r[s] = H.r[j]; s = j; } H.r[s] = rc;}void HeapSort(SequenList &H)//堆排序{ int i; DataType q; for (i = H.length / 2; i > 0; --i) HeapAdjust(H, i, H.length); for (i = H.length; i >1; --i) { q = H.r[1]; H.r[1] = H.r[i]; H.r[i] = q; HeapAdjust(H, 1, i - 1); }}
10、void Distribute(DataType *r, int i, int *f, int *e){ i荏鱿胫协nt j, p; for (j = 0; j <= 26; j++) f[j] = 0; for (p = r[0].next; p; p = r[p].next) { if (i>0) { j = r[p].num[i] - '0'; if (!f[j]) f[j] = p; else r[e[j]].next = p; e[j] = p; } else { j = r[p].num[i] - 'A'; if (!f[j]) f[j] = p; else r[e[j]].next = p; e[j] = p; } }}void Collect(DataType *r, int i, int *f, int *e){ int j, t; for (j = 0; !f[j]; j++); r[0].next = f[j]; t = e[j]; while (j<26) { for (j = j + 1; j<25 && !f[j]; ++j); if (f[j]) { r[t].next = f[j]; t = e[j]; } } r[t].next = 0;}void RadixSort(SequenList &L)//基排序{ int f[27], e[26]; int i; for (i = 0; i<=L.length ; i++) L.r[i].next = i + 1; L.r[L.length].next = 0; for (i = 3; i >= 0; i--) { Distribute(L.r, i, f, e); Collect(L.r, i, f, e); } }
11、主函数int _tmai艘绒庳焰n(int argc, _TCHAR* argv[]){ SequenList L; SetData(讣嘬铮篌L); int choice,radix=0; for (;;) { cout<<"************欢迎进入药品销售管理系统************"<<endl; cout<<"菜单:"<<endl; cout << "\t\t1--展示药品排序情况\n\t\t2--对销售量排序\n\t\t3--对药品单价排序\n\t\t4--对商品销售额排序\n\t\t5--对药品编号排序\n请输入您的选择:"; cin >> choice; switch (choice) { case 1: { Show(L,radix); break; } case 2: { radix = 0; QSort(L, 1, L.length );//快排 break; } case 3: { radix = 0; PopSort(L);//冒泡 break; } case 4: { radix = 0; HeapSort(L);//堆排序 break; } case 5: { radix = 1; RadixSort(L);//基数排序 break; } default:break; } cout << endl << endl; } return 0;}
12、运行界面,小编已经运行过了,基本没有明显bug