实验八:排序的基本操作
输入一组关键字序列分别实现下列排序:
(1)实现简单选择排序、直接插入排序和冒泡排序。
(2)实现希尔排序算法。
(3)实现快速排序算法。
(4)实现堆排序算法。
(5)采用链式存储实现简单选择排序、直接插入排序和冒泡排序。
(6)在主函数中设计一个简单的菜单,分别测试上述算法。
综合训练:采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。
# include # include #define MAXSIZE 20 typedef int KeyType; typedef struct { KeyType key; //InfoType otherinfo; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length; }SqList; typedef SqList HeapType; typedef struct Node { int data; struct Node * pNext; }Node, *pNode; void printMenu(); void InsertSort(SqList &); bool LT(int ,int ); void traverse(SqList &); void SelectSort(SqList &); int SelectMinKey(SqList &, int); void BubbleSort(SqList &); void ShellSort(SqList &L, int dlta[], int t); void ShellInsert(SqList &L, int); void Qsort(SqList &, int ,int); int Partition(SqList &, int ,int); void HeapSort(HeapType &); void HeapAdjust(HeapType &, int ,int ); void Ltraverse(pNode &); void LSelectSort(pNode &); pNode LSelectMinkey(pNode &); void LBubbleSort(pNode &); int main() { int n; SqList L; pNode pHead, p, q; if( !(pHead=(pNode)malloc(sizeof(Node)) )) exit (-1); pHead->pNext = NULL; int dlta[99] = {3, 2, 1}; printf("请输入数组长度L.length = "); scanf("%d", &L.length); p = pHead; for(int i=1; idata = L.r[i].key; p->pNext = q; p = q; } p->pNext = NULL; printMenu(); while(scanf("%d", &n)!=EOF) { switch(n) { case 1: SelectSort(L); printf("---排序后的数组为:"); traverse(L); break; case 2: InsertSort(L); printf("---排序后的数组为:"); traverse(L); break; case 3: BubbleSort(L); printf("---排序后的数组为:"); traverse(L); break; case 4: ShellSort(L, dlta, 2); printf("---排序后的数组为:"); traverse(L); break; case 5: Qsort(L, 1, L.length); printf("---排序后的数组为:"); traverse(L); break; case 6: HeapSort(L); printf("---排序后的数组为:"); traverse(L); break; case 7: LSelectSort(pHead); Ltraverse(pHead); break; case 8: BubbleSort(L); traverse(L); break; case 9: LBubbleSort(pHead); Ltraverse(pHead); break; default: printf("---输入有误,请重新输入!!---n"); } printMenu(); } return 0; } void printMenu() { printf("------排序菜单如下------n"); printf("1.简单选择排序n"); printf("2.直接插入排序n"); printf("3.冒泡排序n"); printf("4.希尔排序n"); printf("5.快速排序n"); printf("6.堆排序n"); printf("7.链式存储实现简单选择排序n"); printf("8.链式存储实现简单直接插入排序n"); printf("9.链式存储实现简单冒泡排序n"); printf("---请选择排序方式:"); } void InsertSort(SqList &L) { int i, j; for( i=2; i=b ) return false; else return true; } void traverse(SqList &L) { for( int i=1; i L.r[j].key) { t = L.r[i]; L.r[i] = L.r[j]; L.r[j] = t; } } } void ShellSort(SqList &L, int dlta[], int t) { int k; for(k=0; k0 && LT(L.r[0].key, L.r[j].key); j-=dk) L.r[j+dk] = L.r[j]; L.r[j+dk] = L.r[0]; } } void Qsort(SqList &L, int low, int high) { int pivotloc; if(low=pivotkey) --high; L.r[low] = L.r[high]; while(low0; i--) HeapAdjust( H, i, H.length ); for( i = H.length; i>1; i--) { t = H.r[1]; H.r[1] = H.r[i]; H.r[i] = t; HeapAdjust(H, 1, i-1); } } void HeapAdjust(HeapType &H, int s,int m) { int j; RedType rc; rc = H.r[s]; for( j=2*s; jpNext; while( NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("n"); } void LSelectSort(pNode &pHead) { pNode p, q; int t; q = (pNode)malloc(sizeof(Node)); for( p = pHead->pNext->pNext; NULL != p->pNext; p = p->pNext) { q = LSelectMinkey( p ); if( p->data != q->data) { t = p->data; p->data = q->data; q->data = t; } } } pNode LSelectMinkey(pNode &p) { pNode q; q = p; int min; min = q->data; while( p != NULL) { if( p->data data; q = p; } p = p->pNext; } return q; } void LBubbleSort(pNode &pHead) { int t; pNode p,q; //RedType t; for( p=pHead->pNext; p->pNext->pNext != NULL; p = p->pNext) for( q=p->pNext; q->pNext!=NULL; q=q->pNext) { if(p->data > q->data) { t = p->data; p->data = q->data; q->data = t; } } }