冒泡排序:相邻元素比较,满足条件就交换元素
1 #include <stdio.h> 2 void PrintArray(int *arr,int len) 3 { 4 int i=0; 5 for(i=0;i<len;i++) 6 { 7 printf("%d ",arr[i]); 8 } 9 } 10 //冒泡排序:相邻元素比较,是一个稳定的排序算法 11 void BubbleSort(int *arr,int len) 12 { 13 int i=0,j=0; 14 int temp=0; 15 int flag=1;//0代表排好序,1代表没排好序了 16 for(i=0;i<len&&flag==1;i++) 17 { 18 flag=0;//先认为排好 19 for(j=1;j<len-i;j++) 20 { 21 if(arr[j-1]>arr[j]) 22 { 23 temp=arr[j-1]; 24 arr[j-1]=arr[j]; 25 arr[j]=temp; 26 flag=1;//1表示还没排好 27 } 28 } 29 } 30 } 31 int main() 32 { 33 int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; 34 int n=sizeof(a)/sizeof(a[0]); 35 int con[256]={0}; 36 BubbleSort(a,n); 37 PrintArray(a,sizeof(a)/sizeof(a[0])); 38 return 0; 39 }
选择排序:与每个元素比较,满足条件就交换
1 #include <stdio.h> 2 void PrintArray(int *arr,int len) 3 { 4 int i=0; 5 for(i=0;i<len;i++) 6 { 7 printf("%d ",arr[i]); 8 } 9 } 10 void SelectSort(int *arr,int len) 11 { 12 int i=0,j=0; 13 int temp=0; 14 for(i=0;i<len;i++) 15 { 16 for(j=i+1;j<len;j++) 17 { 18 if(arr[i]>arr[j]) 19 { 20 temp=arr[i]; 21 arr[i]=arr[j]; 22 arr[j]=temp; 23 } 24 } 25 } 26 } 27 int main() 28 { 29 int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; 30 int n=sizeof(a)/sizeof(a[0]); 31 int con[256]={0}; 32 SelectSort(a,n); 33 PrintArray(a,sizeof(a)/sizeof(a[0])); 34 return 0; 35 }
插入排序:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
#include <stdio.h> void PrintArray(int *arr,int len) { int i=0; for(i=0;i<len;i++) { printf("%d ",arr[i]); } } void InsertSort(int *arr,int len) { int i=0,j=0; int tmp=0; for(i=1;i<len;i++) { tmp=arr[i];//拿出值 for(j=i-1;j>=0&&tmp<arr[j];j--)//如果满足条件,则移动元素 { arr[j+1]=arr[j]; } arr[j+1]=tmp;//将值插入 } } int main() { int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; int n=sizeof(a)/sizeof(a[0]); int con[256]={0}; InsertSort(a,n); PrintArray(a,sizeof(a)/sizeof(a[0])); return 0; }
希尔排序:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
1 #include <stdio.h> 2 void PrintArray(int *arr,int len) 3 { 4 int i=0; 5 for(i=0;i<len;i++) 6 { 7 printf("%d ",arr[i]); 8 } 9 } 10 void ShellSort(int *arr,int len) 11 { 12 int i=0,j=0; 13 int temp=0; 14 int gap=len; 15 do 16 { 17 gap=gap/3+1;//增量 18 for(i=gap;i<len;i++) 19 { 20 temp=arr[i];//拿出值 21 for(j=i-gap;j>=0&&temp<arr[j];j-=gap) 22 { 23 arr[j+gap]=arr[j]; 24 } 25 arr[j+gap]=temp; 26 } 27 }while(gap>1); 28 } 29 int main() 30 { 31 int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; 32 int n=sizeof(a)/sizeof(a[0]); 33 int con[256]={0}; 34 ShellSort(a,n); 35 PrintArray(a,sizeof(a)/sizeof(a[0])); 36 return 0; 37 }
快速排序:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
1 #include <stdio.h> 2 void PrintArray(int *arr,int len) 3 { 4 int i=0; 5 for(i=0;i<len;i++) 6 { 7 printf("%d ",arr[i]); 8 } 9 } 10 void QuickSort(int *arr,int left,int right) 11 { 12 if(left<right) 13 { 14 int i=left; 15 int j=right; 16 int temp=arr[i];//基准数 17 while(i<j) 18 { 19 //从右向左,找比基准数大的 20 while(i<j && temp<=arr[j]) 21 { 22 j--; 23 } 24 if(i<j) 25 { 26 arr[i++]=arr[j]; 27 } 28 //从左向右找比基准数小的 29 while(i<j && temp>=arr[i]) 30 { 31 i++; 32 } 33 if(i<j) 34 { 35 arr[j--]=arr[i]; 36 } 37 } 38 arr[i]=temp;//把基准数放入到i和j同时指向的那个坑 39 QuickSort(arr,left,i-1);//排序左半部分 40 QuickSort(arr,i+1,right);//排序右半部分 41 } 42 } 43 int main() 44 { 45 int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; 46 int n=sizeof(a)/sizeof(a[0]); 47 int con[256]={0}; 48 QuickSort(a,0,n-1); 49 PrintArray(a,sizeof(a)/sizeof(a[0])); 50 return 0; 51 }
归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
1 #include <stdio.h> 2 void PrintArray(int *arr,int len) 3 { 4 int i=0; 5 for(i=0;i<len;i++) 6 { 7 printf("%d ",arr[i]); 8 } 9 } 10 //归并两个有序序列 11 void Merge(int* arr,int left,int right,int mid,int* temp) 12 { 13 int iStart=left; 14 int iEnd=mid; 15 int jStart=mid+1; 16 int jEnd=right; 17 int len=0; 18 while(iStart<=iEnd&&jStart<=jEnd) 19 { 20 if(arr[iStart]<arr[jStart]) 21 { 22 temp[len++]=arr[iStart++]; 23 } 24 else 25 { 26 temp[len++]=arr[jStart++]; 27 } 28 } 29 //之后有一个序列没到边界 30 while(iStart<iEnd) 31 { 32 temp[len++]=arr[iStart++]; 33 } 34 while(jStart<jEnd) 35 { 36 temp[len++]=arr[jStart++]; 37 } 38 return ; 39 } 40 //归并排序 41 void MergeSort(int* arr,int left,int right,int* temp) 42 { 43 int mid=0; 44 if(left<right) 45 { 46 mid=(left+right)/2; 47 MergeSort(arr,left,mid,temp); 48 MergeSort(arr,mid+1,right,temp); 49 Merge(arr,left,right,mid,temp); 50 } 51 return ; 52 } 53 int main() 54 { 55 int a[]={256,1,4,6,9,2,56,34,23,12,0,45,345,44}; 56 int n=sizeof(a)/sizeof(a[0]); 57 int con[256]={0}; 58 QuickSort(a,0,n-1); 59 MergeSort(a,0,n-1,con); 60 PrintArray(a,sizeof(a)/sizeof(a[0])); 61 return 0; 62 }
排序算法总结