数组排序总结
对经典的排序方法:冒泡排序、直接插入排序、直接选择排序、快速排序和归并排序做一个总结。
//冒泡排序
//基本思想:一次冒泡:
从第一个数开始,与后一个数进行比较,若前一个数大于(递增排序)后一个数,则交 换位置,直至数组的倒数第二个数,共进行n-1次比较,最大数排序完成。
以此类推,直至最后一个数(最小数),比较一次即可完成。
#include <stdio.h> #include <malloc.h> //冒泡排序 void bubblesort(int a[],int n){ int i,j,temp; int swap; for(i=n-1;i>0;i--){ swap=0; for(j=0;j<i;j++){ if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; swap=1; } } if(swap==0){ break; } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } bubblesort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
//直接插入排序
//基本思想:从第二个数开始,往前面的数组中插入数字。
对之前的数组进行检索,找到一个数它比要插入的数字大,且这个数字前一个数比要 插入的数字小的位置。从这个数字的位置到要插入数组的数字的位置前一位进行后 移,最后将要插入的数赋给这个位置。
#include <stdio.h> #include <malloc.h> //插入排序 void move(int a[],int first,int last){ int i; for(i=last-1;i>=first;i--){ a[i+1]=a[i]; } } void insertsort(int a[],int n){ int i,r,temp; for(i=2;i<n;i++){ for(r=0;r<i;r++){ if((r!=0&&a[r]>=a[i]&&a[r-1]<a[i])||(r==0&&a[i]<a[0])){ temp=a[i]; move(a,r,i); a[r]=temp; break; } } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } insertsort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
//选择排序
//基本思想:在序列中挑出最小的与第一位数交换,再从第二位数开始的序列中再找出最小的与第 二位数交换,依此进行,直至只剩一个数。
#include <stdio.h> #include <malloc.h> //选择排序 void selectsort(int a[],int n){ int i,j; int min,k,temp; for(i=0;i<n-1;i++){ min=a[i]; k=i; for(j=i+1;j<n;j++){ if(a[j]<min){ min=a[j]; k=j; } } if(k!=i){ temp=a[i]; a[i]=a[k]; a[k]=temp; } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } selectsort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
// 快速排序
//基本思想:从第一个数开始,先从数组的末端开始找比它小的数,找到后,把这个数取出来(挖坑),再从数组的起始端开始找比它大的数,找到后,把这个数填到之前的坑里,再从填的坑往前找比它小的数,填坑....直到两端搜索碰到一块,这个点,把它放入。这个确定的点,将数组分成两块,对每块重复进行上述操作。
#include <stdio.h> #include <stdlib.h> //快速排序 void quicksort(int a[],int first,int last){ if(first<last){ int i=first,j=last; int key=a[i]; while(i<j){ while(i<j&&a[j]>=key){ j--; } if(i<j){ a[i++]=a[j]; } while(i<j&&a[i]<key){ i++; } if(i<j){ a[j--]=a[i]; } } a[j]=key; quicksort(a,first,j-1); quicksort(a,j+1,last); } } int main(){ int n; scanf("%d",&n); int* a; a=(int*)malloc(n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } quicksort(a,0,n-1); for(int r=0;r<n;r++){ printf("%d",a[r]); } free(a);
//归并排序
//基本思想:分为并和归两步。并就是定义第三个数组,把两个排好的数组交替(判断大小)往里填,归就是把一个数组对半拆拆到每个数组只有一个数为止。
#include <stdio.h> #include <stdlib.h> //归并排序 void mergearray(int a[],int first,int mid,int last,int temp[]){ int i=first,j=mid+1; int m=mid,n=last; int k=0; while(i<=m&&j<=n){ if(a[i]<=a[j]){ temp[k++]=a[i++]; } else{ temp[k++]=a[j++]; } } while(i<=m){ temp[k++]=a[i++]; } while(j<=n){ temp[k++]=a[j++]; } for(i=0;i<k;i++){ a[first+i]=temp[i]; } } void mergesort(int a[],int first,int last,int temp[]){ if(first<last){ int mid=(first+last)/2; mergesort(a,first,mid,temp); mergesort(a,mid+1,last,temp); mergearray(a,first,mid,last,temp); } } int main(){ int n; scanf("%d",&n); int* a; a=(int*)malloc(n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int* b; b=(int*)malloc(n); mergesort(a,0,n-1,b); for(int r=0;r<n;r++){ printf("%d",b[r]); } }