链表的排序
2015/4/17 星期五 下午 18:25:04
一、顺序表的排序
对顺序表的排序其实就是对结构体中的关键字的排序。
c语言版:
自定义结构体:
typedef struct node { int age; int height; int width; }Node;
现在想根据其中的age排序,用c语言实现有两种:
1、自定义交换函数,然后用常用的交换排序的方法进行排序就行了。这里用快速排序排序实现:
快排实现:
//自定义结构体交换 void swap(Node *a, Node *b) //指定排序的节点 { Node t = *a; *a = *b; *b = t; } //快排递归实现 void QuickSort(ElemType *elem, int left, int right) //注意这里是闭区间 { if(left < right) { int temp = elem[right].age; //这里要指定是按age排序的 int i = left-1; int j = left; while(j < right) { if(elem[j].age <= temp) //这里也要指定 <= 可以用<带换 { ++i; swap(&elem[i], &elem[j]); } j++; } swap(&elem[i+1], &elem[right]); int r = i+1; QuickSort(elem, left, r-1); QuickSort(elem, r+1, right); } }
- 算法平均复杂度:O(nlogn),最坏情况复杂度:O(n2)。空间复杂度O(n)。
2、 当然c语言中也内置了排序算法qsort,位于stdlib.h头文件中,核心是用快排实现的。
函数原型:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数含义:1 待排序数组首地址。 2 数组中待排序元素数量。 3 各元素的占用空间大小。 4 指向函数的指针
函数关键的比较函数:
这个函数是自定