【数组的排序同样是基础中的基础,相信你们用习惯了list.sort()之类的类库自带函数连一些最基本的算法基础都不会了,下面小镇带来最基本的四个排序。】
冒泡、选择排序是最为基础的排序。冒泡是每次比较相邻的项,然后一次一次将最小的数从某个位置冒泡到第一个。选择排序是找到相应位置的项放到相应的位置上去。
希尔排序是为了使比较差的情况的选择排序优化顺序。
快速排序有着二分法的思想,在数据量大的情况下时间会少一个数量级。时间复杂度是O(nlogn).
代码如下,基础而已很简单:
/* 冒泡排序、插入排序、希尔排序 */ /* * author:镇天宇 */ #include <stdio.h> #include <stdlib.h> #include <memory.h> //冒泡排序 void bubble_sort(int data[],int length) { int j=0,i=0,temp=0; int flag=1; if(data==NULL||length==0) return; for(i=length-1;i>=1&&flag;i--){ flag=0; for(j=0;j<i;j++){ if(data[j]>data[j+1]){ temp=data[j]; data[j]=data[j+1]; data[j+1]=temp; if(flag==0) flag=1; } } } } //插入排序 void insert_sort(int data[],int length) { int j,i,temp=0; if(data==NULL||length==0) return; for(i=1;i<length;i++){ for(j=i;j>=1;j--){ if(data[j]<data[j-1]){ temp=data[j]; data[j]=data[j-1]; data[j-1]=temp; }else{ break; } } } } //希尔排序 void shell_sort(int array[], int length, int step) { int j = 0; int i = 0; int median = 0; if(NULL == array || 0 == length) return; for(; step >= 1; step -=2){ for(int index = 0; index < step; index ++){ if((length -1) < (index + step)) continue; else{ i = index + step; while( (i + step) <= (length - 1)) i += step; } for(; i >= (index + step); i -= step){ for(j = index; j <= i - step; j += step){ if(array[j] >= array[j + step]){ median = array[j]; array[j] = array[j + step]; array[j + step] = median; } } } } } } //快速排序 void quick_sort( int data[], int left, int right ) { int i, j, temp; if ( left < right ) { i = left; j = right; temp = data[i]; while ( i < j ) { while ( i<j &&data[j]>temp ) j--; if ( i < j ) data[i++] = data[j]; while ( i < j && data[i] < temp ) i++; if ( i < j ) data[j--] = data[i]; } data[i] = temp; quick_sort(data,left,i-1); quick_sort(data,i+1,right); } } int main() { int array[20]={5,3,9,32,76,5,3,9,7,6}; shell_sort(array,10,5); int i; for(i=0;i<10;i++) { printf("%d ", array[i]); } }