【C++】冒泡排序、插入排序、快速排序
#include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a为数组,len为数组长度,对a[istart]~a[len-1]进行排序,小浮大沉 //从后面往前两两比较,小的上浮,直到最顶端a[istart]中存放的是剩余数组中最小的数。 for(int i=len;i>istart+1;i--) { if(a[i-2]>a[i-1]) { int temp=a[i-2]; a[i-2]=a[i-1]; a[i-1]=temp; } } if(istart<len-1)BubbleSort(a,istart+1,len); } void InsertionSort(int *a,int ilast,int len)//插入排序 { //取元素a[ilast+1]插入到a[0]~a[ilast]中,从a[ilast]开始往上一个个比较,如果大小顺序不妥,就对调下它们的数值。 int i=ilast+1; int temp=0; while (a[i]<a[i-1]) { temp=a[i-1]; a[i-1]=a[i]; a[i]=temp; i--; if(i<1)break; } if(ilast<len-2)InsertionSort(a,ilast+1,len); } void QuickSort(int *a,int istart,int ilast)//快速排序 { //对数组a中从a[istart]~a[ilast]的所有元素进行排序 //1.取第一个数a[istart]做基准,则a[istart]就留出了一个空位置,从后往前找,找到最近一个小于基数的数值(a[j])存入前面的空位置a[i] //2.从前往后找,找到最近一个大于基数的数值存入a[j],则余出来的空位置又假定为a[i] //3.当i超过j(即i>=j时)结束该轮排序 //4.重复以上步骤 int BaseNum=a[istart]; int i=istart,j=ilast; int k=0; while (1) { while(a[j]>BaseNum && i<j)j--; a[i]=a[j]; i++; if (i>=j) { a[j]=BaseNum; k=j; break; } while(a[i]<BaseNum && i<j)i++; a[j]=a[i]; if (i>=j) { a[j]=BaseNum; k=j; break; } j--; } if(istart<k)QuickSort(a,istart,k); if(k+1<ilast)QuickSort(a,k+1,ilast); } void main() { int a[]={1,4,8,9,7,2,6,3,5}; int len=sizeof(a)/sizeof(int); //BubbleSort(a,0,len); //InsertionSort(a,0,len); QuickSort(a,0,len-1); for(int i=0;i<len;i++) { cout<<a[i]<<" "; } cout<<endl; } //注:本程序的快速排序虽然基本实现功能,但编写凌乱,留待以后改进