选择排序:
假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,以此类推,直到有序,时间复杂度O(n^2)。
代码如下:
void select_sort(int arr[], int length)
{int i,j;for(i=0; i<length; i++){int index = i;for(j=i+1; j<length; j++){if(arr[j] < arr[index])index = j;}if(index == i)continue;else{int temp;temp = arr[index];arr[index] = arr[i];arr[i] = temp;}}
}
插入排序:
插入排序,即把数组中的一个元素取出来(从第二个元素开始取,因为第一个元素自然有序),与数组中的其他元素进行比较,大于被取出元素者后移,小于等于被取出元素者或者前面已经没有元素了,插入其后,时间复杂度O(n^2)
void sort(int *a,int n)
{int i,j,tmp;for(i=1;i<n;i++){//取出要插入的元素tmp = a[i];//大于被取出元素者后移,小于等于被取出元素者或者前面已经没有元素了,插入其后for(j=i;j>0&&a[j-1]>tmp;j--){a[j] = a[j-1];}a[j] = tmp;}
}
快速排序:
找到一个基准(一般是数组第一个或者最后一个),然后从数组最后一个元素(j)开始找到比基准小的数,放到基准的左边,然后从数组第一个元素(i)开始找到比基准大的数,放到基准的右边,以此类推,直到 i=j,然后递归调用,直到数组有序。
void quick_sort(int s[], int l,int h)
{if(l < h){int i = l,j = h,base = s[l];while(i < j){while(i < j && s[j] >= base) //从右往左找到一个小于base的数j--;if(i < j)s[i++] = s[j];while(i < j && s[i] <= base) //从左往右找到一个大于base的数i++;if(i < j)s[j--] = s[i];}s[i] = base; //i = j 的时候,将base填入i与j相同的位置quick_sort(s, l, i-1); //递归调用,实现左右两边的排序quick_sort(s,i+1, h);}
}