C语言常用内部排序的实现

发表于:2012-3-02 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lwb75(CSDNblog)    来源:51Testing软件测试网采编

  这是用VC6.0实现的C语言常用内部排序,暂时包含插入、快速、冒泡和选择排序,待排序的数据为结构体,排序关键字为结构体里面的key,排序完毕就输出结构体的数据:

// sort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h" // SYSTEMTIME
#include "stdlib.h"  // system调用

#define SIZE 9

typedef struct
{
 int key;
 char name[10];
}Data;

// 0号数据不参与排序,只用作监督哨或者临时变量
Data ListOld[] = {{0, "零号"}, {49, "一号"}, {38, "二号"}, {65, "三号"}, {97, "四号"}, {76, "五号"}, {13, "六号"}, {27, "七号"}, {49, "八号"}};
Data ListNew[SIZE];

void PrintData(Data *pData, int n);
void CopyList(Data *pNew, Data *pOld, int n);
void InsertSort(Data *pData, int n);
void QuickSort(Data *pData, int n);
void BubbleSort(Data *pData, int n);
void SelectSort(Data *pData, int n);

int main(int argc, char* argv[])
{
 int i;
 SYSTEMTIME sys;

 do
 {
  system("cls");
  printf("\t\tC语言数据内部排序!\n\n\t输入对应数字,选择排序方法:\n");
  printf("\t1、插入排序\t\t2、快速排序\n");
  printf("\t3、冒泡排序\t\t4、选择排序\n");
  printf("\t0、退出\n");

  scanf("%d", &i);

  switch( i )
  {
  case 1:
   GetLocalTime(&sys);  // 记录排序开始时间
   printf("%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n" ,sys.wYear,sys.wMonth,
    sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
   InsertSort(ListOld, SIZE);
   break;
  case 2:
   QuickSort(ListOld, SIZE);
   break;
  case 3:
   BubbleSort(ListOld, SIZE);
   break;
  case 4:
   SelectSort(ListOld, SIZE);
   break;
  default:
   break;
  }
  system("pause");
 }while(i != 0);

 return 0;
}

void PrintData(Data *pData, int n)
{
 int i;
 for(i=1; i<n; i++)
 {
  printf("%d,%s   ", pData[i].key, pData[i].name);
 }
 printf("\n");
}

void CopyList(Data *pNew, Data *pOld, int n)
{
 for(int i=1; i<n; i++)
 {
  pNew[i] = pOld[i];
 }
}

// 插入排序
void InsertSort(Data *pData, int n)
{
 int i, j;

 CopyList(ListNew, pData, n);
 for(i=2; i<n; i++)
 {
  if(ListNew[i].key < ListNew[i-1].key)
  {
   ListNew[0] = ListNew[i];
   for(j=i-1; ListNew[0].key < ListNew[j].key; j--)
   {
    ListNew[j+1] = ListNew[j];
   }
   ListNew[j+1] = ListNew[0];
  }
 }
 printf("InsertSort\n");
 PrintData(ListOld, SIZE);
 PrintData(ListNew, SIZE);
}

// 快速排序
int Partition(Data *pData, int low, int high)
{
 int pivotkey = pData[low].key;
 pData[0] = pData[low];

 while(low < high)
 {
  while(low<high && pData[high].key>=pivotkey)
   high--;
  pData[low] = pData[high];
  while(low<high && pData[low].key<=pivotkey)
   low++;
  pData[high] = pData[low];
 }
 pData[low] = pData[0];

 return low;
}
void QSort(Data *pData, int low, int high)
{
 int pivotloc;

 if(low < high)
 {
  pivotloc = Partition(pData, low, high);
  QSort(pData, low, pivotloc-1);
  QSort(pData, pivotloc+1, high);
 }
}
void QuickSort(Data *pData, int n)
{
 CopyList(ListNew, pData, n);
 QSort(ListNew, 1, n-1);
 printf("QuickSort\n");
 PrintData(ListOld, SIZE);
 PrintData(ListNew, SIZE);
}

//冒泡排序
void BubbleSort(Data *pData, int n)
{
 int i, j, isExchanged;

 CopyList(ListNew, pData, n);
 for(i=1; i<n-1; i++)
 {
  isExchanged = 0;

  for(j=1; j<n-i; j++)
  {
   if(ListNew[j].key > ListNew[j+1].key)
   {
    ListNew[0] = ListNew[j];
    ListNew[j] = ListNew[j+1];
    ListNew[j+1] = ListNew[0];

    isExchanged = 1;
   }
  }

  if( !isExchanged )
   break;
 }

 printf("BubbleSort\n");
 PrintData(ListOld, SIZE);
 PrintData(ListNew, SIZE);
}

// 选择排序
void SelectSort(Data *pData, int n)
{
 int i, j, index;

 CopyList(ListNew, pData, n);
 for(i=1; i<n; i++)
 {
  index = i;
  for(j=i+1; j<n; j++)
  {
   if(ListNew[j].key < ListNew[index].key)
   {
    index = j;
   }
  }

  if(index != i)
  {
   ListNew[0] = ListNew[i];
   ListNew[i] = ListNew[index];
   ListNew[index] = ListNew[0];
  }
 }

 printf("SelectSort\n");
 PrintData(ListOld, SIZE);
 PrintData(ListNew, SIZE);
}

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号