数据结构 实验六 排序

数据结构 实验六  排序

 

 

本次实验实现排序中的直接插入、冒泡排序、快速排序、简单选择排序、堆排序等排序算法。

 

下面放一下自己的代码:

 

#include <stdio.h>
#include <stdlib.h>
#include "DataHead.h"

#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;    // 堆采用顺序表存储表示


void main()
{
    // 函数声明
    void CreateSqList(SqList &L);
    void ShowList(SqList L);
    void InsertSort(SqList &L);
    void QuickSort(SqList &L);
    void SelectSort(SqList &L);
    void HeapSort(HeapType &H);
    void BubbleSort(SqList &L);

    SqList L;

    printf("\n*********************** 排 序 ***********************\n\n");
    
    CreateSqList(L);    // 创建顺序表

    int selectIndex = 0;
    while(true)
    {
        printf("\n\n(1)、插入排序\n");
        printf("(2)、冒泡排序\n");
        printf("(3)、快速排序\n");
        printf("(4)、简单选择排序\n");
        printf("(5)、堆排序\n");
        printf("(6)、重新建立一个新的顺序表\n");
        printf("(0)、退出程序\n\n");
        printf("\n----------------------请选择您希望的操作序号:");
        scanf("%d", &selectIndex);
        switch(selectIndex)
        {
        case 1:
            InsertSort(L);
            ShowList(L);
            break;
        case 2:
            BubbleSort(L);
            ShowList(L);
            break;
        case 3:
            QuickSort(L);
            ShowList(L);
            break;
        case 4:
            SelectSort(L);
            ShowList(L);
            break;
        case 5:
            HeapSort(L);
            ShowList(L);
            break;
        case 6:
            CreateSqList(L);
            break;
        case 0:
            return;
        default:
            break;
        }
        printf("\n");
        system("pause");
    }


    system("pause");
}



bool EQ(KeyType a, KeyType b)    { return a == b; }
bool LT(KeyType a, KeyType b)    { return a < b; }
bool LQ(KeyType a, KeyType b)    { return a <= b; }

void CreateSqList(SqList &L)
{
    int length, i;
    printf("请构造一个任意的顺序表,以备接下来的排序所用: \n");
    printf("请输入顺序表的长度: \n");
    scanf("%d", &length);
    L.length = length;
    for(i = 1; i <= L.length; i++)
    {
        printf("请输入第 <%d> 个元素的值: ", i);
        scanf("%d", &L.r[i].key);
    }
    printf("\n\n顺序表创建完成!\n\n");
}

void ShowList(SqList L)
{
    int i;
    printf("排序后的顺序表为: \n");
    for(i = 1; i <= L.length; i++)
    {
        printf("%d  ", L.r[i].key);
    }
}

void InsertSort(SqList &L) {  // 算法10.1
  // 对顺序表L作直接插入排序。
  int i,j;
  for (i=2; i<=L.length; ++i)
    if (LT(L.r[i].key, L.r[i-1].key)) { 
      // "<"时,需将L.r[i]插入有序子表
      L.r[0] = L.r[i];                 // 复制为哨兵
      for (j=i-1;  LT(L.r[0].key, L.r[j].key);  --j)
        L.r[j+1] = L.r[j];             // 记录后移
      L.r[j+1] = L.r[0];               // 插入到正确位置
    }
} // InsertSort

int Partition(SqList &L, int low, int high) {  // 算法10.6(b) 快速排序
   // 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,
   // 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
   KeyType pivotkey;
   L.r[0] = L.r[low];            // 用子表的第一个记录作枢轴记录
   pivotkey = L.r[low].key;      // 枢轴记录关键字
   while (low<high) {            // 从表的两端交替地向中间扫描
      while (low<high && L.r[high].key>=pivotkey) --high;
      L.r[low] = L.r[high];      // 将比枢轴记录小的记录移到低端
      while (low<high && L.r[low].key<=pivotkey) ++low;
      L.r[high] = L.r[low];      // 将比枢轴记录大的记录移到高端
   }
   L.r[low] = L.r[0];            // 枢轴记录到位
   return low;                   // 返回枢轴位置
} // Partition

//int Partition(SqList &L, int low, int high) {  // 算法10.6(a)
//   // 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,
//   // 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
//   KeyType pivotkey;
//   RedType temp;
//   pivotkey = L.r[low].key;     // 用子表的第一个记录作枢轴记录
//   while (low<high) {           // 从表的两端交替地向中间扫描
//      while (low<high && L.r[high].key>=pivotkey) --high;
//      temp=L.r[low];
//      L.r[low]=L.r[high];
//      L.r[high]=temp;           // 将比枢轴记录小的记录交换到低端
//      while (low<high && L.r[low].key<=pivotkey) ++low;
//      temp=L.r[low];
//      L.r[low]=L.r[high];
//      L.r[high]=temp;           // 将比枢轴记录大的记录交换到高端
//   }
//   return low;                  // 返回枢轴所在位置
//} // Partition

void QSort(SqList &L, int low, int high) {  //算法10.7
  // 对顺序表L中的子序列L.r[low..high]进行快速排序
  int pivotloc;
  if (low < high) {                      // 长度大于1
    pivotloc = Partition(L, low, high);  // 将L.r[low..high]一分为二
    QSort(L, low, pivotloc-1); // 对低子表递归排序,pivotloc是枢轴位置
    QSort(L, pivotloc+1, high);          // 对高子表递归排序
  }
} // Qsort

void QuickSort(SqList &L) {  // 算法10.8
   // 对顺序表L进行快速排序
   QSort(L, 1, L.length);
} // QuickSort

// 在L.r[i..L.length]中选择key最小的记录
int SelectMinKey(SqList L, int i)
{
    int k = i;
    int min = L.r[i].key;
    for( ; i <= L.length; i++ )
    {
        if(L.r[i].key < min)
        {
            min = L.r[i].key;
            k = i;
        }
    }
    return k;
}

void SelectSort(SqList &L) {  // 算法10.9
  // 对顺序表L作简单选择排序。
  int i,j;
  for (i=1; i<L.length; ++i) { // 选择第i小的记录,并交换到位
    j = SelectMinKey(L, i);  // 在L.r[i..L.length]中选择key最小的记录
    if (i!=j) {                // L.r[i]←→L.r[j];   与第i个记录交换
      RedType temp;
      temp=L.r[i];
      L.r[i]=L.r[j];
      L.r[j]=temp;    
    } 
  }
} // SelectSort

void HeapAdjust(HeapType &H, int s, int m) {  // 算法10.10
  // 已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,
  // 本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆
  // (对其中记录的关键字而言)
  int j;
  RedType rc;
  rc = H.r[s];
  for (j=2*s; j<=m; j*=2) {   // 沿key较大的孩子结点向下筛选
    if (j<m && H.r[j].key<H.r[j+1].key) ++j; // j为key较大的记录的下标
    if (rc.key >= H.r[j].key) break;         // rc应插入在位置s上
    H.r[s] = H.r[j];  s = j;
  }
  H.r[s] = rc;  // 插入
} // HeapAdjust

void HeapSort(HeapType &H) {  // 算法10.11
   // 对顺序表H进行堆排序。
   int i;
   RedType temp;
   for (i=H.length/2; i>0; --i)  // 把H.r[1..H.length]建成大顶堆
      HeapAdjust ( H, i, H.length );
      for (i=H.length; i>1; --i) {
         temp=H.r[i];
         H.r[i]=H.r[1];
         H.r[1]=temp;  // 将堆顶记录和当前未经排序子序列Hr[1..i]中
                       // 最后一个记录相互交换
         HeapAdjust(H, 1, i-1);  // 将H.r[1..i-1] 重新调整为大顶堆
      }
} // HeapSort

// 冒泡排序
void BubbleSort(SqList &L)
{
    int i, j, temp;
    bool change = TRUE;
    for( i = L.length; i >= 1 && change; --i )
    {
        change = FALSE;
        for( j =0; j < i; ++j )
        {
            if( L.r[j].key > L.r[j+1].key )
            {
                temp = L.r[j].key;
                L.r[j].key = L.r[j+1].key;
                L.r[j+1].key = temp;
                change = TRUE;
            }
        }
    }
}// Bubble_Sort

 

 

可以直接复制上述代码,也可以去我的网盘下载源cpp文件

http://pan.baidu.com/s/105Jqr

 

 

 

 

 

posted @ 2013-12-01 21:55  云端之上  阅读(996)  评论(0编辑  收藏  举报