最常见的算法如下:
选择排序,插入排序,冒泡排序,快排相应的代码如下
void select_sort(int array[], int n) {
for(int i=0 ; i<n ; i++){
int min=i;
for(int j=i ; j<n ; j++){
if(array[j]<array[min])
min=j;
}
swap(array[i],array[min]);
}
}
void insert_sort(int array[], int n){
int i,j,temp;
for(i=1 ; i<n ; i++){
temp=array[i];
for(j=i-1 ; j>=0 ; j--){
if(array[j]>temp)
array[j+1]=array[j];
else
break;
}
array[j+1]=temp;
}
}
void bubble_sort(int array[], int n){
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<n-i-1 ; j++){
if(array[j]>array[j+1])
swap(array[j],array[j+1]);
}
}
}
快排的划分分为普通划分以及hoarse划分
第一个为普通划分,第二个为hoarse划分:
int partition(int array[] , int left , int right){
int pivot=array[left];
int k=left-1;
for(int i=left ; i<=right ; i++){
if(array[i]<=pivot){
k++;
swap(array[i],array[k]);
}
}
swap(array[left],array[k]);
return k;
}
int hoarsepartition(int array[] , int left , int right){
int pivot=array[left];
for( ; left<right ; ){
for( ; array[right]>pivot && left<right ; right--);
array[left]=array[right];
for( ; array[left]<=pivot && left<right ; left++);
array[right]=array[left];
}
array[left]=pivot;
return left;
}
void quick_sort(int array[] , int left , int right){
if(left<right){
int pivot=hoarsepartition(array,left,right);
quick_sort(array,left,pivot-1);
quick_sort(array,pivot+1,right);
}
}
线性时间的排序算法:计数排序
void count_sort(int array[] , int n){
int *p=(int*)malloc(sizeof(int)*1000);
int i,j;
memset(p,0,sizeof(int)*1000);
for(i=0 ; i<n ; i++){
p[array[i]]++;
}
for(i=0,j=0 ; j<n && i<1000 ; ){
if(p[i]-->0){
array[j++]=i;
continue;
}
else
i++;
}
}