演算法第四版 排序演算法的C語言實現

2021-08-09 08:31:57 字數 3833 閱讀 3708

#ifndef alsg4_h__

#define alsg4_h__

#include

#include

#include

#include

typedef

unsigned

char byte;

typedef

char* string;

typedef

struct int_array intarray;

extern

unsigned

long numberofless;

extern

unsigned

long numberofexch;

int isempty(void);

int readint(void);

double readdouble(void);

float readfloat(void);

long readlong(void);

char readchar(void);

byte readbyte(void);

string readstring(void);

/*** 讀取輸入

*/intarray readints(void);

void free(intarray);

double* readdoubles(string name);

string* readstrings(string name);

/*** 排序演算法 實現在sort.c中

*/void selection(intarray); //選擇排序

void insertion(intarray); //插入排序

void shell(intarray); //希爾排序

void quick(intarray a);

void quick_sort(int *, int, int);

int partition(int *, int, int);

void mergebu(intarray a);

void merge(intarray);

void merge(int *, int, int, int, int *);

void merge_sort(int *,int , int, int *);

//排序演算法公共函式

int less(int , int ); //比較函式

void exch(int *,int ,int); //交換函式

int issorted(intarray a);

intarray intarraycopy(intarray);

intarray randomintarray(int,int,int);

intarray orderintarray(int);

intarray reverseorderintarray(int);

#endif

#include "algs4.h"

int readint(void)

intarray readints(void) ;

int n;

a.arr=(int*)calloc(a.length,sizeof(int));

while(scanf("%d",&n)!=eof)

return a;

}intarray intarraycopy(intarray a)

void free(intarray a)

intarray randomintarray(int min,int max,int size)

intarray orderintarray(int size)

intarray reverseorderintarray(int size)

#include "algs4.h"

unsigned

long numberofless = 0;

unsigned

long numberofexch = 0;

//選擇排序

void selection(intarray a)

gettimeofday(&end,null);

timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;

printf("selection:arraysize=%-10d numberofless=%-10ld numberofexch=%-10ld sumles***ch=%-10ld timer=%ld us.\n",

a.length,numberofless,numberofexch,numberofless+numberofexch,timer);

}//插入排序

void insertion(intarray a)

gettimeofday(&end,null);

timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;

printf("insertion:arraysize=%-10d numberofless=%-10ld numberofexch=%-10ld sumles***ch=%-10ld timer=%ld us.\n",

a.length,numberofless,numberofexch,numberofless+numberofexch,timer);

}//希爾排序

void shell(intarray a)

h = h/3;

}gettimeofday(&end,null);

timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;

printf("shell :arraysize=%-10d numberofless=%-10ld numberofexch=%-10ld sumles***ch=%-10ld timer=%ld us.\n",

a.length,numberofless,numberofexch,numberofless+numberofexch,timer);

}//歸併排序

void quick(intarray a)

void merge(intarray a)

void mergebu(intarray a)

int less(int v, int w)

void exch(int *a,int i,int j)

int issorted(intarray a)

void merge_sort(int *a,int lo, int hi,int *aux)

void merge(int *a, int lo, int mid, int hi, int *aux)

void quick_sort(int *a, int lo, int hi)

int partition(int *a,int lo,int hi)

exch(a, lo, j);

return j;

}

#include "algs4.h"

int main()

編譯:gcc test.c sort.c algs4.c

執行:./a.out

《演算法(第四版)》排序 模板

本書對排序類演算法有乙個模板,包括了以下幾種方法 1 sort 這個方法裡面實現的就是排序的演算法 2 less 這個方法裡是利用了comparable介面裡的compareto方法,其中compareto方法對於本物件與傳入的比較物件小於,等於,大於,分別返回負數,0,正數 這個方法如果compa...

《演算法(第四版)》排序 希爾排序

由 插入排序 可知,它是一種不穩定的演算法,當序列已經接近有序時,排序速度較快,但是如果最小的在最後面,那可能需要最小的交換了n 1次才能換到最前面。希爾排序在插入排序的基礎上進行了改進,交換不相鄰的元素,以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序,具體做法如下。1.假設陣列長...

《演算法(第四版)》排序 堆排序

1.什麼是堆?講堆排序之前,先了解一下什麼是堆。堆其實相當於一種資料結構,它的本質是一種陣列物件,但是它裡面的內同又是一顆完全二叉樹結構,它的特點是父節點的值大於 或小於 兩個子節點的值,常常用於優先佇列 堆排序等。堆在陣列中的索引有如下的特點。陣列索引為k的元素,它的父節點的索引為 k 2 下取整...