1.冒泡
方法1//从前往后冒泡
void sort(int a[],int n)
{
int i,j,t;
for(i=0;i
for(j=0;j if(a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t;} } void sort(int a[],int n) { int i,j,t; for(i=n-1;i>0;i--)//n-1->0控制冒泡趟数 for(j=0;j if(a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t;} } 方法2//从后往前冒泡 void sort(int a[],int n) { int i,j,t; for(i=0;i for(j=n-1;j>i;j--)//从后往前两两比较 if(a[j] { t=a[j];a[j]=a[j-1];a[j-1]=t;} } void sort(int a[],int n) { int i,j,t; for(i=n-1;i>0;i--)//n-1->0控制冒泡趟数 for(j=n-1;j>n-1-i;j--)//从后往前两两比较 if(a[j] { t=a[j];a[j]=a[j-1];a[j-1]=t;} } //两次优化:1、有无交换的记录2、通过最后一次冒泡决定下一趟冒泡范围void sort(int a[],int n) { int i,j,k=n-1;//k变量记录每次交换的位置,初值为n-1 while(1) //冒泡的趟数不受数组元素个数的控制 { flag=0;j=k; //j接收最后一次交换的位置,决定冒泡的范围 for(i=0;i if(a[i]>a[i+1]) { tmp=a[i];a[i]=a[i+1];a[i+1]=tmp; k=i;//k变量记录每次交换的位置 flag=1;//flag变量反映每趟冒泡是否有交换 } if(flag==0) break;//没有交换就退出冒泡 } } //双向冒泡:每一趟冒泡将大数往后推的同时将小数往前推 void sort(int a[],int n) { int i,j,t; for(i=0;i for(j=i;j { if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}//大数往后推 if(a[n-2-j]>a[n-1-j]){t=a[n-2-j];a[n-2-j]=a[n-1-j];a[n-1-j]=t;}//小数往后推 } } 2.选择排序 /将最小值调整到最前的单向排序 void sort(int a[],int n) { int i,j,min,t; for(i=0;i { min=i; for(j=i+1;j if(a[j] t=a[i];a[i]=a[min];a[min]=t;//将最小值交换到最前面 } } //将最大值调整到最后的单向排序 void sort(int a[],int n) { int i,j,max,t; for(i=n-1;i>0;i--) { max=i; for(j=i-1;j>=0;j--)//从后往前比较,获取最大值位置 if(a[j]>a[max]) max=j; t=a[i];a[i]=a[max];a[max]=t;//将最大值交换到最后面 } } //同时调整最小值和最大值位置,从两头逐步缩小选择范围的双向排序 void sort(int a[],int n) { int i,min,max,t; int left=0,right=n-1;//初始选择范围 while(left { min=left; max=left; //min和max的初值理论上可以是数组中的任意位置for(i=left;i<=right;i++)//同时获取最小值和最大值位置 { if(a[i] if(a[i]>a[max]) max=i; } t=a[min],a[min]=a[left],a[left]=t;//将最小值交换到开头 if(max==left) max=min;//假如最大值本来在开头,则重新设置max的值t=a[max],a[max]=a[right],a[right]=t;//将最大值调整到末尾 left++;right--;//两头同时缩小排序范围 } } //对left~right范围内的元素作选择排序,双向排序 void sort(int a[],int left,int right) { int i,min,max,t; while(left { min=left; max=left; //min和max的初值理论上可以是数组中的任意位置for(i=left;i<=right;i++)//同时获取最小值和最大值位置 { if(a[i] if(a[i]>a[max]) max=i; } t=a[min],a[min]=a[left],a[left]=t;//将最小值交换到开头 if(max==left) max=min;//假如最大值在开头,则重新设置max的值,想想为什么? t=a[max],a[max]=a[right],a[right]=t;//将最大值调整到末尾 left++;right--;//两头同时缩小排序范围 } } 3.插入排序 1、从前往后将无序表中的元素插入到前面的有序表中 void sort(int a[],int n) { int i,j,x; for(i=1;i { j=i-1; x=a[i]; while(j>=0&&a[j]>x)//不断往前比较 { a[j+1]=a[j]; j--; } a[j+1]=x;//插入到合适的位置 } } 2、从后往前将无序表中的元素插入到后面的有序表中 void sort(int a[],int n) { int i,j,x; for(i=n-2;i>=0;i--)//有序表在后,无序表在前 { j=i+1; x=a[i]; while(a[j] { a[j-1]=a[j]; j++; } a[j-1]=x;//插入到合适的位置 } } 4.快速排序 快速排序:以第一个元素为基准,重排数组,不断往复 //将数组重排成前面比基准小,后面比基准大,基准元素处于合适的位置void qsort(int a[],int left,int right)//排序区域:从left->right { int i,j,x,t; if (left>right) return; for(j=left,i=left;i<=right;i++) { if(a[i]<=a[left]) //不大于基准的元素调整到前面 { t=a[i];a[i]=a[j];a[j]=t;j++;} } //将基准元素调整到合适的位置,形成前面比它小,后面比它大 t=a[left];a[left]=a[j-1];a[j-1]=t; qsort(a,left,j-2); qsort(a,j,right); } 5. 二维数组按行、列排序 、以下四种排序算法以每一行最后一列(或任意一列)作为排序的依据//1、冒泡排序 void line_sort(int a[][M],int n) { int i,j,k,temp; for(i=0;i for(j=0;j if(a[j][M-1]>a[j+1][M-1])//相邻相行比较 for(k=0;k {temp=a[j][k];a[j][k]=a[j+1][k];a[j+1][k]=temp;} } //2、顺序排序 void line_sort(int a[][M],int n) { int i,j,k,temp;