一、插入排序
1、直接插入排序
2、希尔排序
二、选择排序
1、简单选择排序
2、堆排序
三、交换排序
1、冒泡排序(Bubble Sort)
对一个有n个数的序列,进行(n-1)次扫描,每次扫描都比较相邻的两个元素大小,若顺序错误,则将两个元素交换,这样每次扫描都会得到正确排序的最后一位元素。
比如:3 2 1
第一次扫描:3 2 1-->2 3 1 2 3 1-->2 1 3
第二次扫描:2 1 3-->1 2 3
void bubblesort(int a[],int n) { for(int j=0;j<n-1;j++)//进行(n-1)次扫描 for(int i=0;i<n-1-j;i++)//对序列扫描 { if(a[i]>a[i+1])//若错误排序,则交换 { int temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } }
2、快速排序
快排是对冒泡排序的一种改进,它的思想是选取一个关键数据(key),经过一趟排序,把要排序的数据分成独立的两部分,一部分全部小于或等于关键数据,一部分大于等于关键数据,然后按此方法对这两部分进行快排,整个过程用递归实现,以此达到整个数据有序。关键数据(key)可以在数据中仍选一个,但一般选第一个数据。
快速排序可以分为以下几步:
1) 设置两个变量first、last分别指向需要快排的首部(low)和尾部(high);
2)以第一个数据为关键数据,key=a[first];
3)从后面开始搜素(last--),找到第一个小于key的数据,并且将它赋值给a[first],即a[first]=a[last];
4) 从前面开始搜素(first++),找到第一个大于key的数据,并且将它赋值给a[last],即a[last]=a[first];
5) 重复3、4步,直到前面的数据都小于key,后面的数据都大于key,即first=last;然后把关键数据放到序列中,既a[first]=key;
6)分别将关键数据的前部分和后部分进行1~5步,又可以将前部分和后部分别分为两部分,然后继续进行1~5步操作,以此继续下去,直到序列排好序,这样就可以用到递归实现了。
例如原序列:3 8 2 4 5 7 1 6
key=3, 3 8 2 4 5 7 1 6 首先将3作为关键数据,用first、last分别指向序列的首部和尾部,把小于3和大于3的元素分开,首先比较3和6,6>3,last左移;
key=3, 3 8 2 4 5 7 1 6 比较3和1,1<3,把1放到左边,即a[first]=a[last];然后从左边开始;
key=3, 1 8 2 4 5 7 1 6 比较8和3,8>3,把8移到右边,即a[last]=a[first],又从右边开始比较;
key=3, 1 8 2 4 5 7 8 6 7、5、4>3,直到last移到2(2<3)的位置,再从左边开始,以此下去,直到first=last;
key=3, 1 2 2 4 5 7 8 6 把key放到序列中,即a[firsrt]=key;变成如下序列;
1 2 3 4 5 7 8 6
之后把2的左边和右边分别进行快排,需要进行递归调用,最终生成最后的结果。
代码如下:
void quicksort(int a[],int low,int high)//进行快排的数组,以及需进行快排的首尾地址 { if(low>=high)//递归结束条件 return ; int first=low; int last=high; int key=a[first]; while(first<last)//快排过程 { while(first<last && a[last]>=key) last--; a[first]=a[last]; while(first<last && a[first]<=key) first++; a[last]=a[first]; } a[first]=key;//将关键数据放到原序列中 quicksort(a,low,first-1);//左边快排,递归进行 quicksort(a,first+1,high);//右边快排,递归进行 }
四、归并排序
五、基数排序