知识点:排序
在C语言中,对一组数据进行排序有多种方法:交换排序、选择排序、冒泡排序、插入排序、归并排序、快速排序以及希尔排序等
其中冒泡排序和交换排序比较简单,交换排序是又是选择排序的基础。以下这个例子包含几种排序方法,以对分数降序排序为背景,使用链表,顺便填补对链表中数据排序的空白。
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 struct link 5 { 6 int data; 7 struct link *next; 8 }; 9 void DisplayNode(int *pData,int n); 10 struct link *AppendNode(struct link *head,int *pData); 11 void ExchangeSort(int n,int *pData); 12 void SelectionSort(int n,int *pData); 13 void bubbleSort(int n,int *pData); 14 void InsterSort(int n,int *pData); 15 int main() 16 { 17 int n,i; 18 int *pData=NULL;//定义一个基类型为整形的指针数组,用于指向节点数据域,方便排序 19 struct link *head=NULL; 20 printf("How many student?\n"); 21 scanf("%d",&n); 22 pData=(int *)malloc(n*sizeof(int)); 23 for(i=0; i<n; i++) 24 { 25 printf("Input %d student‘s score\n",i+1); 26 head=AppendNode(head,pData); 27 } 28 DisplayNode(pData,n); 29 //ExchangeSort(n,pData); 30 //SelectionSort(n,pData); 31 //bubbleSort(n,pData); 32 InsterSort(n,pData); 33 DisplayNode(pData,n); 34 return 0; 35 } 36 37 struct link *AppendNode(struct link *head,int *pData) 38 { 39 int i=1; 40 int score; 41 scanf(" %d",&score); 42 struct link *p=NULL,*pr=head; 43 p=(struct link *)malloc(sizeof(struct link)); 44 if(p==NULL) 45 { 46 printf("No enough memory\n"); 47 exit(0); 48 } 49 if(head==NULL) 50 { 51 head=p; 52 p->data=score; 53 p->next=NULL; 54 pData[0]=p->data; 55 } 56 else 57 { 58 while(pr->next!=NULL) 59 { 60 pr=pr->next; 61 i++; 62 } 63 pr->next=p; 64 p->data=score; 65 p->next=NULL; 66 pData[i]=p->data; 67 } 68 return head; 69 } 70 71 void DisplayNode(int *pData,int n) 72 { 73 int i; 74 for(i=0;i<n;i++) 75 { 76 printf("%4d",pData[i]); 77 } 78 printf("\n"); 79 } 80 81 void ExchangeSort(int n,int *pData) 82 { 83 int i,j,temp,count=0; 84 for(i=0;i<n-1;i++) 85 { 86 for(j=i+1;j<n;j++) 87 if(pData[j]>pData[i]) 88 { 89 temp=pData[i]; 90 pData[i]=pData[j]; 91 pData[j]=temp; 92 count++; 93 } 94 } 95 printf("\nExchange times:%d\n",count); 96 } 97 98 void SelectionSort(int n,int *pData) 99 { 100 int i=0,j=0,k,temp=0,count=0; 101 for(i=0;i<n-1;i++) 102 { 103 k=i; 104 for(j=i+1;j<n;j++) 105 { 106 if(pData[k]<pData[j]) 107 k=j; 108 } 109 if(i!=k) 110 { 111 temp=pData[k]; 112 pData[k]=pData[i]; 113 pData[i]=temp; 114 count++; 115 } 116 } 117 printf("Selection times %d\n",count); 118 } 119 120 void bubbleSort(int n,int *pData) 121 { 122 int i,j,temp=0; 123 for(i=0;i<n;i++) 124 { 125 for(j=i+1;j<n;j++) 126 { 127 if(pData[i]<pData[j]) 128 { 129 temp=pData[i]; 130 pData[i]=pData[j]; 131 pData[j]=temp; 132 } 133 } 134 } 135 } 136 137 void InsterSort(int n,int *pData) 138 { 139 int i,j,k,temp=0; 140 for(i=0;i<n-1;i++) 141 { 142 k=i; 143 for(j=i+1;j>0;j--) 144 { 145 if(pData[j]<pData[k]) 146 { 147 temp=pData[i]; 148 pData[i]=pData[k]; 149 pData[k]=temp; 150 } 151 else 152 { 153 break; 154 } 155 } 156 } 157 }