基础排序算法之——选择排序,插入排序,快速排序

选择排序:

假设长度为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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章