C语言面试题分类->排序算法

1.选择排序。

  每次将最小的数,与剩余数做比较。找到更小的,做交换。

  时间复杂度:O(n²)

  空间复杂度:O(1)

  优缺点:耗时但内存空间使用小。

void selectSort(int *p,int len)
{
    int i, j,tmp;
    for(i = 0; i < len; i++)
    {
        for(j = i+1; j < len; j++)
        {
            if(p[i] > p[j])
            {
                 tmp = p[i];
                p[i] = p[j];
                p[j] = tmp;
            }
        }
    }

}
int main()
{
    int array[8] = {4,2,7,9,3,10,6,11};
 //popupSort1(array,8);
//  popupSort2(array,5);
  //  selectSort(array,8);
    insertion_sort(array, 8);
    int i;
    for(i = 0;i<8;i++)
    {
        printf("%d\n",array[i]);
    }
}

2。冒泡排序

  一轮比较两个相邻的数,获得一个最大的数仍在后边。

  时间复杂度:O(n²)

  空间复杂度:O(1)

  优点:稳定。

void popupSort1(int *p,int len)
{
    int i, j, tmp;
    for(i = 0; i < len ; i++)
    {
        for(j = i; j < len -1; j++)
        {
            if(p[j] > p[j+1])
            {
                 tmp = p[j];
                p[j] = p[j+1];
                p[j+1]  = tmp;
            }
        }
    }
}
int main()
{
    int array[8] = {4,2,7,9,3,10,6,11};
 //popupSort1(array,8);
//  popupSort2(array,5);
  //  selectSort(array,8);
    insertion_sort(array, 8);
    int i;
    for(i = 0;i<8;i++)
    {
        printf("%d\n",array[i]);
    }
}

3。插入排序

  把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程.

  时间复杂度:O(n²)

  空间复杂度:O(1)

  优点:稳定。

//插入排序
void insertion_sort(int array[], int length)

{

    int i, j;
    int temp; // 用来存放临时的变量

    for(i = 1; i < length; i++)
    {
        temp = array[i];

        for(j = i-1; (j >= 0)&&(array[j] > temp); j--)
        {
            array[j + 1] = array[j];
        }
        array[j + 1] = temp;
    }

}
int main()
{
    int array[8] = {4,2,7,9,3,10,6,11};
 //popupSort1(array,8);
//  popupSort2(array,5);
  //  selectSort(array,8);
    insertion_sort(array, 8);
    int i;
    for(i = 0;i<8;i++)
    {
        printf("%d\n",array[i]);
    }
}

 

4。快速排序

通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

  时间复杂度:O(nlog2n)

  空间复杂度:O(nlog2n)

  优点:不稳定。

int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;//这是从小到大排序,若是从大到小改成: return *(int *)b-*(int *)a;
}
int main()
{
    int a[100];
    int n;
    scanf("%d",&n);//n代表数组中有几个数字
    int i;
    for(i=1;i<=n;i++)
        scanf("%d",&a[i-1]);
    qsort(a,n,sizeof(a[0]),cmp);//(数组,需要排序的数字个数,单个数字所占内存大小,比较函数)
     for(i=1;i<=n;i++)
        printf("%d ",a[i-1]);
    return 0;
}

 

5。堆排序

6。归并排序

 

posted @ 2018-04-03 18:18  夜空释  阅读(212)  评论(0编辑  收藏  举报