C语言数据结构各种排序算法(选择,直接,希尔,起泡等排序)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数据结构各种排序算法(选择,直接,希尔,起泡等排序)相关的知识,希望对你有一定的参考价值。

#include <stdio.h>

#include<stdlib.h>

#include <time.h>

#define MAX 20         /*线性表中最多元素个数*/

typedef int KeyType;

typedef char InfoType[10];

typedef struct

{

  KeyType key;

  InfoType data;

}RecType;

 

void InsertSort(RecType R[],int n)

{

  int i,j,k;

  RecType temp;

  for(i=1;i<n;i++)

  {

    temp=R[i];

j=i-1;

while(j>=0 && temp.key<R[j].key)

{

  R[j+1]=R[j];

  j--;

}

R[j+1]=temp;

printf("   i=%d   ",i);

for(k=0;k<n;k++)

  printf("%3d",R[k].key);

printf("\n");

  }

}

 

void ShellSort(RecType R[],int n)

{

  int i,j,d,k;

  RecType temp;

  d=n/2;

  while(d>0)

  {

for(i=d;i<n;i++)

{

  j=i-d;

  while(j>0 && R[j].key>R[j+d].key)

  {

    temp=R[j];

    R[j]=R[j+d];

    R[j+d]=temp;

    j=j-d;

  }

}

printf("   d=%d:   ",d);

for(k=0;k<n;k++)

  printf("%3d",R[k].key);

printf("\n");

d=d/2;

  }

}

 

void BubbleSort(RecType R[],int n)

{

  int i,j,k;

  RecType temp;

  for(i=0;i<n-1;i++)

  {

       for(j=n-1;j>i;j--)

                if(R[j].key<R[j-1].key)

                {

                     temp=R[j];

                     R[j]=R[j-1];

                     R[j-1]=temp;

                }

              printf("   i=%d   ",i);

              for(k=0;k<n;k++)

                printf("%3d",R[k].key);

              printf("\n");

  }

}

 

void QuickSort(RecType R[],int s,int t,int n)

{

  int i=s,j=t,k;

  RecType temp;

  if(s<t)

  {

temp=R[s];

while(i!=j)

{

  while(j>i && R[j].key>temp.key)

    j--;

  if(i<j)

  {

    R[i]=R[j];

    i++;

  }

  while(i<j && R[i].key<temp.key)

    i++;

  if(i<j)

  {

    R[j]=R[i];

    j--;

  }

}

R[i]=temp;

printf("      ");

for(k=0;k<n;k++)

  if(k==i)

    printf(" [%d]",R[k].key);

  else

    printf("%4d",R[k].key);

printf("\n");

QuickSort(R,s,i-1,n);

QuickSort(R,i+1,t,n);

  }

}

 

void SelectSort(RecType R[],int n)

{

  int i,j,k,l;

  RecType temp;

  for(i=0;i<n-1;i++)

  {

k=i;

for(j=i+1;j<n;j++)

  if(R[j].key<R[k].key)

    k=j;

if(k!=i)

{

  temp=R[i];

  R[i]=R[k];

  R[k]=temp;

}

printf("    i=%d   ",i);

for(l=0;l<n;l++)

  printf("%3d",R[l].key);

printf("\n");

  }

}

 

void DispHeap(RecType R[],int i,int n)    /*以括号表示法输出建立的堆*/

{

                if(i<=n)

              printf("%d",R[i].key);

                if(2*i<=n)

                            {

                                          printf("(");

                                          DispHeap(R,2*i,n);

                                          printf(",");

                                          if(2*i+1<=n)

                                            DispHeap(R,2*i+1,n);

                                          printf(")");

                            }

}

void Sift(RecType R[],int low,int high)         /*调整堆*/

{

  int i=low,j=2*i;

  RecType temp=R[i];

  while(j<=high)

  {

if(j<high && R[j].key<R[j+1].key)

  j++;

if(temp.key<R[j].key)

{

  R[i]=R[j];

  i=j;

  j=2*i;

}

else

  break;

  }

  R[i]=temp;

}

void HeapSort(RecType R[],int n)        /*对R[1]到R[n]元素实现堆排序*/

{

  int i;

  RecType temp;

  for(i=n/2;i>=1;i--)

Sift(R,i,n);

  printf("初始堆:");

  DispHeap(R,1,n);

  printf("\n");

  for(i=n;i>=2;i--)

  {

printf("交换%d与%d,输出%d\n",R[i].key,R[1].key,R[1].key);

temp=R[1];

R[1]=R[i];

R[i]=temp;

Sift(R,1,i-1);

printf("筛选调整得到堆:");

DispHeap(R,1,i-1);

printf("\n");

  }

}

 

void PrintArray(RecType R[],int n)

{

  int i;

  for(i=0;i<n;i++)

printf("%3d",R[i].key);

  printf("\n");

}

 

void main()

{

      

  int i,n=10,cord;

  RecType R[MAX],S[MAX];

  srand(time(0));              /*用系统时间作为随机数种子*/

for (i=0; i<n; i++)

S[i].key=100*rand()/RAND_MAX;     /*利用随机函数产生10个100以内的随机整数*/

do

  {

printf("*************主菜单****************\n");

printf("1-直接插入排序\n");

printf("2-希尔排序\n");

printf("3-冒泡排序\n");

printf("4-快速排序\n");

printf("5-简单选择排序\n");

printf("6-堆排序\n");

printf("7-退出\n");

printf("请输入你的选择:");

scanf("%d",&cord);

switch(cord)

{

  case 1:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=0;i<n;i++)

          R[i].key=S[i].key;

    InsertSort(R,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 2:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=0;i<n;i++)

          R[i].key=S[i].key;

    ShellSort(R,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 3:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=0;i<n;i++)

          R[i].key=S[i].key;

    BubbleSort(R,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 4:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=0;i<n;i++)

          R[i].key=S[i].key;

    QuickSort(R,0,n-1,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 5:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=0;i<n;i++)

          R[i].key=S[i].key;

    SelectSort(R,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 6:

    printf("初始关键字:");

    PrintArray(S,n);

        for(i=1;i<=n;i++)

          R[i].key=S[i-1].key;

    HeapSort(R,n);

    printf("最后结果 :");

    PrintArray(R,n);

    break;

  case 7:

    exit(0);

  default:

    printf("选择错误,请重新输入!\n");

}

  }while(1);

}

以上是关于C语言数据结构各种排序算法(选择,直接,希尔,起泡等排序)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构c语言版八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择排序,冒泡排序!

知识分享:数据结构常用 7 种排序算法(无基数排序)

王道数据结构7(排序)

王道数据结构8(排序)

《数据结构》--内部排序算法比较

几种常见的排序算法分析学习