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