当前位置:文档之家› 实验 各种排序方法的比较

实验 各种排序方法的比较

实验六各种排序方法的比较一、实验目的1.通过实验掌握排序的基本概念,对排序的稳定性及排序的时间复杂性有深刻的认识。

2.掌握各种排序方法的基本思想和算法实现。

3.能够灵活地选用某种排序方法解决问题。

二、实验要求1.认真阅读和掌握本实验的参考程序。

2.保存程序的运行结果,并结合程序进行分析。

三、实验内容编写一个程序,对所给的数据(程序中给出或通过键盘初始化均可)进行排序,要求尽可能多的选择不同的排序算法,并显示排序前和排序后的结果。

#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define N 10int a[10] = { 9,27,45,87,17,23,25,92,8,75 };typedef struct{int key;int info;}RecordNode;typedef struct Sort{int n; //记录个数RecordNode *record;}SortObject;/*直接插入排序*/void insertSort(SortObject *pvector){int i, j;RecordNode temp;for (i = 1; i < pvector->n; i++){temp = pvector->record[i]; j = i - 1;while ((temp.key < pvector->record[j].key) && (j >= 0)){pvector->record[j + 1] = pvector->record[j]; j--;}if (j != (i - 1)) pvector->record[j + 1] = temp;}}/*二分法插入排序*/void binSort(SortObject * pvector){int i, j, left, mid, right;RecordNode temp;for (i = 1; i < pvector->n; i++){temp = pvector->record[i]; left = 0; right = i - 1;while (left <= right){mid = (left + right) / 2;if (temp.key<pvector->record[mid].key) right = mid - 1;else left = mid + 1;}for (j = i - 1; j >= left; j--)pvector->record[j + 1] = pvector->record[j];if (left != i) pvector->record[left] = temp;}}struct Node;typedef struct Node ListNode;struct Node{int key;ListNode *next;};typedef ListNode * LinkList;void listSort(LinkList * plist){ListNode *now, *pre, *p, *q, *head;head = *plist;pre = head->next;if (pre == NULL) return;now = pre->next;if (now == NULL) return;while (now != NULL){q = head; p = head->next;while (p != now && p->key <= now->key) { q = p; p = p->next; }if (p == now) { pre = pre->next; now = pre->next; continue; }pre->next = now->next;q->next = now; now->next = p;now = pre->next;}}/*Shell排序*/void shellSort(SortObject * pvector, int d){ /* 按递增序进行Shell排序 */int i, j, increment;RecordNode temp;for (increment = d; increment > 0; increment /= 2){for (i = increment; i<pvector->n; i++){temp = pvector->record[i];j = i - increment;while (j >= 0 && temp.key<pvector->record[j].key){pvector->record[j + increment] = pvector->record[j];j -= increment;}pvector->record[j + increment] = temp;}}}/*直接选择排序*/void selectSort(SortObject * pvector){int i, j, k;RecordNode temp;for (i = 0; i < pvector->n - 1; i++){ /* 做n-1趟选择排序 */k = i;for (j = i + 1; j<pvector->n; j++) /* 在无序区内找出排序码最小的记录Rk*/if (pvector->record[j].key<pvector->record[k].key) k = j;if (k != i){ /* 记录Rk与Ri互换 */temp = pvector->record[i];pvector->record[i] = pvector->record[k];pvector->record[k] = temp;}}}/*起泡排序*/void bubbleSort(SortObject * pvector){int i, j, noswap;RecordNode temp;for (i = 0; i<pvector->n - 1; i++){noswap = TRUE;for (j = 0; j<pvector->n - i - 1; j++)if (pvector->record[j + 1].key<pvector->record[j].key){temp = pvector->record[j];pvector->record[j] = pvector->record[j + 1];pvector->record[j + 1] = temp;noswap = FALSE;}if (noswap) break;}}/*快速排序*/void quickSort(SortObject * pvector, int l, int r){int i, j;RecordNode temp;if (l >= r) return;i = l; j = r; temp = pvector->record[i];while (i != j){while ((pvector->record[j].key >= temp.key) && (j>i))j--;if (i<j) pvector->record[i++] = pvector->record[j];while ((pvector->record[i].key <= temp.key) && (j>i))i++;if (i<j) pvector->record[j--] = pvector->record[i];}pvector->record[i] = temp;quickSort(pvector, l, i - 1);quickSort(pvector, i + 1, r);}/*归并*/void merge(RecordNode* r, RecordNode *r1, int low, int m, int high) {int i, j, k;i = low; j = m + 1; k = low;while ((i <= m) && (j <= high)){if (r[i].key <= r[j].key) r1[k++] = r[i++];else r1[k++] = r[j++];}while (i <= m) r1[k++] = r[i++];while (j <= high) r1[k++] = r[j++];}void mergePass(RecordNode *r, RecordNode *r1, int n, int length) {int j, i = 0;while (i + 2 * length - 1<n){merge(r, r1, i, i + length - 1, i + 2 * length - 1);i += 2 * length;}if (i + length - 1<n - 1)merge(r, r1, i, i + length - 1, n - 1);elsefor (j = i; j<n; j++) r1[j] = r[j];}/*二路归并排序*/void mergeSort(SortObject *pvector){RecordNode record[N];int length = 1;while (length<pvector->n){mergePass(pvector->record, record, pvector->n, length); /* 一趟归并,结果放在r1中*/length *= 2;mergePass(record, pvector->record, pvector->n, length); /* 一趟归并,结果放在r中 */length *= 2;}}void s1()/* 直接插入排序 */{int i;SortObject *p1 = (SortObject *)malloc(sizeof(SortObject));p1->n = 10;p1->record = (RecordNode *)malloc(sizeof(RecordNode)*p1->n);for (i = 0; i<p1->n; i++)p1->record[i].key = a[i];insertSort(p1);printf("直接插入排序后 : ");for (i = 0; i<p1->n; i++)printf("%d ", p1->record[i].key);printf("\n");}void s2()/* 二分法插入排序 */{int i;SortObject *p2 = (SortObject *)malloc(sizeof(SortObject));p2->n = 10;p2->record = (RecordNode *)malloc(sizeof(RecordNode)*p2->n);for (i = 0; i<p2->n; i++)p2->record[i].key = a[i];binSort(p2);printf("二分法插入排序后: ");for (i = 0; i<p2->n; i++)printf("%d ", p2->record[i].key);printf("\n");}void s3()/* Shell排序 */{int i;SortObject *p3 = (SortObject *)malloc(sizeof(SortObject));p3->n = 10;p3->record = (RecordNode *)malloc(sizeof(RecordNode)*p3->n);for (i = 0; i<p3->n; i++)p3->record[i].key = a[i];shellSort(p3, 4);printf("Shell排序后 : ");for (i = 0; i<p3->n; i++)printf("%d ", p3->record[i].key);printf("\n");}void s4()/* 直接选择排序 */{int i;SortObject *p4 = (SortObject *)malloc(sizeof(SortObject));p4->n = 10;p4->record = (RecordNode *)malloc(sizeof(RecordNode)*p4->n);for (i = 0; i<p4->n; i++)p4->record[i].key = a[i];selectSort(p4);printf("直接选择排序后 : ");for (i = 0; i<p4->n; i++)printf("%d ", p4->record[i].key);printf("\n");}void s5()/* 起泡排序 */{int i;SortObject *p5 = (SortObject *)malloc(sizeof(SortObject));p5->n = 10;p5->record = (RecordNode *)malloc(sizeof(RecordNode)*p5->n);for (i = 0; i<p5->n; i++)p5->record[i].key = a[i];bubbleSort(p5);printf("起泡排序后 : ");for (i = 0; i<p5->n; i++)printf("%d ", p5->record[i].key);printf("\n");}void s6()/* 快速排序 */{int i;SortObject *p6 = (SortObject *)malloc(sizeof(SortObject));p6->n = 10;p6->record = (RecordNode *)malloc(sizeof(RecordNode)*p6->n);for (i = 0; i<p6->n; i++)p6->record[i].key = a[i];quickSort(p6, 0, p6->n - 1);printf("快速排序后 : ");for (i = 0; i<p6->n; i++)printf("%d ", p6->record[i].key);printf("\n");}void s7()/* 二路归并排序 */{int i;SortObject *p7 = (SortObject *)malloc(sizeof(SortObject));p7->n = 10;p7->record = (RecordNode *)malloc(sizeof(RecordNode)*p7->n);for (i = 0; i<p7->n; i++)p7->record[i].key = a[i];mergeSort(p7);printf("二路归并排序后 : ");for (i = 0; i<p7->n; i++)printf("%d ", p7->record[i].key);printf("\n");}void main(){int i, b;printf("初始顺序 : ");for (i = 0; i<10; i++)printf("%d ", a[i]);printf("\n\n");printf("********操作选项********\n\n");printf(" 1.直接插入排序\n");printf(" 2.二分法插入排序\n");printf(" 3.Shell排序\n");printf(" 4.直接选择排序\n");printf(" 5.冒泡排序\n");printf(" 6.快速排序 \n");printf(" 7.二路归并排序\n");printf(" 0.退出操作\n");printf("************************");printf(" \n 请输入你需要操作的序号: ");scanf("%d", &b);printf("\n\n");while (1){switch (b){case 1: /* 直接插入排序 */s1();break;case 2: /* 二分法插入排序 */s2();break;case 3: /* Shell排序 */s3();break;case 4: /* 直接选择排序 */s4();break;case 5: /* 起泡排序 */s5();break;case 6: /* 快速排序 */s6();break;case 7: /* 二路归并排序 */s7();break;case 0:exit(0);}printf(" \n 请继续选择一个序号");scanf("%d", &b);printf("\n");}}。

相关主题