选择排序:
假设长度为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);
}
}