允执 引商刻羽,杂以流徵

排序算法练习

冒泡排序算法

如下结果是升序排列

#include<stdio.h>

int bubble_sort(int *array, int len)
{
  int i,j;
  int tmp;

  for(i = 0; i< len-1; i++)
    for(j = i+1; j < len; j++)
      if( *(array+i) > *(array+j) ){
        tmp = *(array+i);
        *(array+i) = *(array+j);
        *(array+j) = tmp;
      }

  return 0;
}

int main()
{
  int i;
  int test_array[5] = {6,9,5,1,3};

  bubble_sort(test_array, sizeof(test_array)/sizeof(test_array[0]));

  for(i=0;i<5 ;i++)
    printf("%d ",test_array[i]);

  printf("\n");

  return 0;
}

选择排序

#include<stdio.h>

int test_select_sort(int *array,int len)
{
  int i,j;
  int tmp;
  int index;

  for(i=0;i<len-1;i++){
    index = i;
    for(j=i+1;j<len;j++)
      if( *(array+index)>*(array+j) )
          index = j;

    if( index != i){
      tmp = *(array+i);
      *(array+i) = *(array+index);
      *(array+index) = tmp;
    }
  }

  return 0;
}

int main()
{
  int i;
  int test_array[5] = {17,8,27,89,1};

  test_select_sort(test_array,5);

  for(i=0;i<5;i++)
    printf("%d ",test_array[i]);

  printf("\n");
  return 0;
}

插入排序

代码理解方法:从后面一个数和前的数比较,如果比较小,就把它暂存起来,然后把前面所有和它相比小的数向后位移一位,最后把暂存大数放到移出来得空位上,陆续循环到数列末尾。

#include<stdio.h>

int insert_sort(int *array, int len)
{
    int i,j,tmp;

    for(i=1;i<len;i++){
        if( *(array+i-1) > *(array+i) ){
            tmp = *(array+i);
            j = i;
            while( (j>0) && ( *( array+j-1) > tmp ) ){
                *(array+j) = *(array+j-1);
                j--;
            }
            *(array+j) = tmp;
        }
    }
    return 0;
}

int main()
{
    int i;
    int array[5] = {5,3,4,6,2};

    insert_sort(array,5);

    for(i=0;i<5;i++)
        printf("%d ",array[i]);

    printf("\n");
    return 0;
}

上面的排序时间复杂度都是O(n*n)

希尔排序

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

#include <stdio.h>

int shell_sort(int a[], int n)
{
    int i,j,k,gap;
    int temp;

    for( gap = n/2; gap > 0; gap /=2 ){
        for( i= 0; i < gap; i++){ //gap组插入排序
            for(j = i+gap; j < n; j+=gap){  //直接插入排序
                if( a[j] < a[j-gap] ){
                    temp = a[j];
                    k = j - gap;
                    while( (k >= 0) && ( a[k] > temp)){
                        a[k+gap] = a[k];
                        k -= gap;
                    }
                    a[k + gap] = temp;
                }
            }
        }
    }
    return 0;

}

int main()
{
    int i;
    int array[10] = {9,2,8,3,6,7,5,1,4,0};

    shell_sort(array,10);

    for(i=0;i<10;i++)
        printf("%d ",array[i]);
    printf("\n");

    return 0;
}

堆排序

#include <stdio.h>

int heap_adjust(int a[],int s,int m)
{
    int temp,j;
    temp = a[s];

    for( j = 2*s + 1 ; j < m ; j *= 2 ){
        if( j < (m-1) && a[j] < a[j+1] )
            j++;
        if(temp > a[j])
            break;
        a[s] = a[j];
        s = j;
    }
    a[s] = temp;

    return 0;
}

int swap(int a[],int pos,int n)
{
    int tmp;
    tmp = a[pos];
    a[pos] = a[n];
    a[n] = tmp;

    return 0;
}

int heap_sort(int a[], int n)
{
    int i;
    for( i = n/2 -1 ; i >= 0; i--)
        heap_adjust(a,i,n);

    for( i = n-1 ; i > 1 ; i-- ){
        swap(a,0,i);
        heap_adjust(a,0,i-1);
    }

    return 0;
}

int main()
{
    int i;
    int array[10] = {9,2,8,3,6,7,5,1,4,0};

    heap_sort(array,10);

    for(i=0;i<10;i++)
        printf("%d ",array[i]);
    printf("\n");

    return 0;
}
点击查看评论
推荐到豆瓣

Blog

Opinion

Project