一些简单的排序算法 c 语言实现

来源:互联网 发布:融华财富网络贷款 编辑:程序博客网 时间:2024/05/22 10:47

数据类型定义:

#define MAXSIZE 20#define N 8typedef int KeyType;typedef struct{    KeyType key;}RedType;typedef struct{    RedType r[MAXSIZE+1];    int length;}SqList;typedef SqList HeapType;


1、稍微改进后的冒泡排序:

void BubbleSort(int *array,int n){    int i = n,j;//数组长度    int lastSwap;//最后发生交换的位置    int temp;    while(i > 1){        lastSwap = 1;        for(j = 0; j < i;j++){            if(array[j+1] < array[j]){                {                    temp = array[j+1];                    array[j+1] = array[j];                    array[j] = temp;                }                lastSwap = j;            }        }        i = lastSwap;    }}

该算法相比普通的冒泡排序,主要增加了一个旗帜lastSwap来标记每一趟冒泡过程中,发生交换操作的位置,这样,当下一趟冒泡的时候,只需要比较到旗帜标记的位置即可。因为,旗帜标记的位置以后的元素,都已经是有序,从而减少不必要的比较。


2、插入排序:

void InsertSort(SqList *L){    int i,j;    for(i = 2;i <= L->length; i++){        if((L->r[i]).key < (L->r[i-1]).key){            L->r[0] = L->r[i];//L->R[0]是辅助储存变量,本身不存储元素            L->r[i] = L->r[i-1];            for(j = i-2; (L->r[0]).key < (L->r[j]).key; j--){                L->r[j+1] = L->r[j];            }            L->r[j+1] = L->r[0];        }    }}


3、希尔排序:

void ShellInsert(SqList *L,int dk){    int i,j;    for(i = dk+1;i<=L->length;++i){        if(L->r[i].key < L->r[i-dk].key){            L->r[0] = L->r[i];            for(j = i-dk;j>0 && (L->r[0].key < L->r[j].key);j-=dk){                L->r[j+dk] = L->r[j];            }            L->r[j+dk] = L->r[0];        }    }}void ShellSort(SqList *L,int dlta[],int t){    int k;    for(k = 0; k < t;k++){        ShellInsert(L,dlta[k]);    }}

4、堆排序:

void HeapAdjust(HeapType *H,int s,int m){    int j;    RedType rc = H->r[s];    for(j = 2*s;j<=m;j*=2){        if(j < m && H->r[j].key < H->r[j+1].key) ++j;        if(!(rc.key < H->r[j].key)) break;        H->r[s] = H->r[j];        s = j;    }    H->r[s] = rc;}void HeapSort(HeapType *H){    int i;    RedType temp;    for(i = H->length/2;i>0;i--){        HeapAdjust(H,i,H->length);    }    for(i = H->length;i>1;--i){        temp = H->r[1];        H->r[1] = H->r[i];        H->r[i] = temp;        HeapAdjust(H,1,i-1);    }}

5、快速排序:

int Partition(SqList *L,int low,int high){    int pivotkey;    L->r[0] = L->r[low];    pivotkey = L->r[low].key;    while(low < high){        while(low < high && L->r[high].key >= pivotkey)            --high;        L->r[low] = L->r[high];        while(low < high && L->r[low].key <= pivotkey)            ++low;        L->r[high] = L->r[low];    }    L->r[low] = L->r[0];    return low;}void QSort(SqList *L,int low,int high){    int pivotloc;    if(low < high){        pivotloc = Partition(L,low,high);        QSort(L,low,pivotloc-1);        QSort(L,pivotloc+1,high);    }}

一道anyview上的题目:

荷兰国旗问题,题目描述:

10.32⑤ 荷兰国旗问题:设有一个仅由红、白、兰
这三种颜色的条块组成的条块序列。请编写一个时
间复杂度为O(n)的算法,使得这些条块按红、白、
兰的顺序排好,即排成荷兰国旗图案。


实现下列函数:
void HFlag(FlagList &f)
/* "荷兰国旗"的元素为red,white和blue,*/
/* 分别用字符'0','1'和'2'表示          */


"荷兰国旗"的顺序表的类型FlagList定义如下:
#define red   '0'
#define white '1'
#define blue  '2'


typedef char ColorType;


typedef struct { 
  ColorType r[MAX_LENGTH+1];
  int       length; 
} FlagList;


算法实现:

void HFlag(FlagList &f){     int i=1;     int j=1;//每次都标记第一white出现的位置     int k = f.length;     while(j<=k){                  //注意循环结束的条件,这时候下标范围为f.length - k之间的元素已经排好序,全部是blue        if(f.r[j] == red){            swap(f.r[i++],f.r[j++]);        }        else if(f.r[j] == white){            j++;        }        else{            swap(f.r[j],f.r[k--]);        }          }     }






原创粉丝点击