1、冒泡排序
//冒泡排序BubbleSort //每次扫描,比较和交换相邻元素,保证一次扫描后,最大元素在最后一个 //每次扫描后,扫描队列长度减一 //时间复杂度:O(N^2) //空间复杂度:O(N) //稳定性:稳定 //输入:要排序的数组,数组长度 //输出:void,Q[]将处于排序状态 void BubbleSort(int Q[], int N) { int i; int swap=1; int Temp; while(swap>0) { swap=0; for(i=1;i<N;i++) { if(Q[i-1]>Q[i]) { swap++; Temp=Q[i-1]; Q[i-1]=Q[i]; Q[i]=Temp; } } } }
2、选择排序
//选择排序SelectionSort //从头扫描到尾,每次将最小元素放到第一个 //每次扫描后,队列长度减一 //时间复杂度:O(N^2) //空间复杂度:O(N) //稳定性:稳定 //输入:要排序的数组,数组长度 //输出:void,Q[]将处于排序状态 void SelectionSort(int Q[], int N) { int i,j,k; int Temp; for(i=0;i<N;i++) { k=i; for(j=i+1;j<N;j++) { if(Q[j]<Q[i])k=j; } Temp=Q[k]; Q[k]=Q[i]; Q[i]=Temp; } }
3、插入排序
//插入排序InsertionSort //起始队列长度为1,每次队列长度加1 //通过元素移动,将队列调整为有序状态 //时间复杂度:O(N^2) //空间复杂度:O(N) //稳定性:稳定 //输入:要排序的数组,数组长度 //输出:void,Q[]将处于排序状态 void InsertionSort(int Q[], int N) { int i,j; int Temp; for(i=1;i<N;i++) { Temp = Q[i]; for(j=i;j>0 && Q[j-1]>Temp;j--) { Q[j]=Q[j-1]; } Q[j]=Temp; } }
4、希尔排序
//希尔排序ShellSort //指定一个步长,将需要排序的数字,按序号%步长分组 //对每组进行插入排序,然后减小步长,再次分组,排序直到步长为1结束 //时间复杂度:O(n^2) //空间复杂度:O(n) //稳定性:稳定 //输入:要排序的数组,数组长度 //输出:void,Q[]将处于排序状态 void ShellSort(int Q[], int N) { int i,j; int Temp; int Step; for(Step=N/2;Step>0;Step=Step/2) { for(i=Step;i<N;i++) { Temp = Q[i]; for(j=i;j>=Step && Q[j-Step]>Temp;j=j-Step) { Q[j]=Q[j-Step]; } Q[j]=Temp; } //dumpArray(Q,N); } }
5、归并排序
//归并排序MergeSort //二路归并首先将归并长度定为2,在归并集内进行排序 //然后归并长度×2,将有序集合进行归并 //时间复杂度:O(NlogN) //空间复杂度:O(N) //稳定性:稳定 //输入:要排序的数组,数组长度 //输出:void,Q[]将处于排序状态 void Merge(int Q[],int TempArray[], int left, int mid, int right) { int i=left,j=mid,k=left; while(i<mid && j<=right) { if(Q[i]>Q[j]) { TempArray[k++]=Q[j++]; } else { TempArray[k++]=Q[i++]; } } while(i<mid) { TempArray[k++]=Q[i++]; } while(j<=right) { TempArray[k++]=Q[j++]; } for(k=left;k<=right;k++) { Q[k]=TempArray[k]; } } void MSort(int Q[],int TempArray[], int left, int right) { int center; if(left<right) { center=(left+right)/2; MSort(Q,TempArray,left,center); MSort(Q,TempArray,center+1,right); Merge(Q,TempArray,left,center+1,right); } } void MergeSort(int Q[], int N) { int *TempArray = malloc(N*sizeof(int)); if(TempArray!=NULL) { MSort(Q,TempArray,0,N-1); } else { //Todo: deal with not enough memory //RaiseError("MergeSort: not enough memory"); } }