#include "stdio.h"
#include "stdlib.h"
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//不带头结点
void selectSort(LinkList* L) {
LNode * h = L, * p, * q, * r, * s;
L = NULL;
while (h != NULL) {
p = s = h;
q = r = NULL;
while (p != NULL) {
if (p->data > s->data) {
s = p;
r = q;
}
q = p;
p = p->next;
}
if (s == h)
h = h->next;
else
r->next = s->next;
s->next = L;
L = s;
}
}
//判断一个数据序列是否构成一个小根堆,扫描所有分支结点,遇到孩子结点的关键字小于根结点的关键字时返回false,扫描完后返回true
int IsMinHeap(ElemType A[], int len) {
int i;
if (len % 2 == 0) {//len为偶数,有一个单分支结点
if (A[len / 2] > A[len])//判断单分支结点
return 0;
for (i = len / 2 - 1; i >= 1; i--)//判断所有双分支结点
if (A[i] > A[2 * i] || A[i] > A[2 * i + 1])
return 0;
}
else {//len为奇数时,没有单分支结点
for (i = len / 2; i >= 1; i--)//判断所有双分支结点
if (A[i] > A[2 * i] || A[i] > A[2 * i + 1])
return 0;
}
return 1;
}
//顺序表前m个元素递增有序,后n个元素递增有序
//将数组A[1...m+n]视为一个已经过m趟插入排序的表,则从m+1趟开始,将后n个元素依次插入到前面的有序表中
void InsertSort(ElemType A[], int m, int n) {
int i, j;
for (i = m + 1; i <= m + n; i++) {
A[0] = A[i];
for (j = i - 1; A[j] > A[0]; j--)
A[j + 1] = A[j];
A[j + 1] = A[0];
}
}
//计数排序,统计关键字比它小的元素个数,然后把它放入另一个数组对应的位置上
void CountSort(ElemType A[], ElemType B[], int n) {
int count;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0, count = 0; j < n; j++)
if (A[j] < A[i])
count++;
B[count] = A[i];
}
}
//计数排序优化,任意两个记录之间只比较一次
void CountSortt(ElemType A[], ElemType B[], int n) {
int i, j;
int count;
for (i = 0; i < n; i++)
A[i].count=0;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++)
if (A[i] < A[j])
A[j].count++;
else
A[i].count++;
B[A[i].count] = A[i];
}
}
//以kn为枢轴进行一次快速排序
int Partition(ElemType K[], int n) {
int i = 1, j = n;
ElemType pivot = K[j];
while (i < j) {
while (i < j && K[i] <= pivot)
i++;
if (i < j)
K[j] = K[i];
while (i < j && K[j] >= pivot)
j--;
if (i < j)
K[i] = K[j];
}
K[i] = pivot;
return i;
}
努力的意义就是放眼望去以后都是喜欢的人和事......