typedef int KeyType;
typedef int DataType;
typedef struct {
KeyType key;
DataType info;
}RecordNode;
typedef struct {
int n;
RecordNode *record;
}SortObject;
void insertSort(SortObject *pvector)
{
int i,j;
RecordNode temp;
RecordNode *data = pvector->record; //这里的思维是复制了record, 使得下面的代码更简洁
for(i=1;i<pvector->n;++i){
temp = data[i];
for(j=i-1;temp.key<data[j].key && j>=0;j--)
data[j+1] = data[j]; //此数组即为关键点,实现了元素的后移,如果前面的数不大于等于模板temp则能够后移
if(j!=i-1) data[j+1]=temp; //将腾出的位置插入temp
}
}
//引入二分思想,方法差不多
void binSort(SortObject *pvector){
int i, j, left, mid, right;
RecordNode temp;
RecordNode *data = pvector->record;
for(i=1;i<pvector->n;i++){
temp = data->[i];
left = 0;
right = i-1;
while(left<right){
mid = (left + right)/2;
if(temp.key<data[mid].key) right = mid - 1;
else left = mid +1;
}
for(j=i-1;j>=left;j--) data[j+1] = data[j];
if(left!=i) data[left] = temp;
}
}
//表排序 理解需要画图,更加直观
struct Node;
typedef struct Node *ListNode;
struct Node {
KeyType key;
DataType info;
ListNode *next;
};
typedef ListNode *LinkList;
void listSort(LinkList *plist){
ListNode *now, *pre, *p, *q, *head;
head = *plist;
pre = head->next;
if(pre == NULL) return ;
now = pre->next;
if(now == NULL) return ;
while(now!=NULL){
q = head;
p = head->next;
while(p!=now && p->key <= now->key) {
q=p;
p = p->next;
}
if(p == now) {
pre = pre->next;
now = pre->next;
continue;
}
pre->next = now->next;
q->next = now;
now->next = p;
now = pre->next;
}
}
//shell排序
void shellsort(SortObject *pvector,int d) {
int i, j, inc;
RecordNode temp, *data = pvector->record;
for(inc=d;inc>0;inc/=2){
for(i=inc;i<pvector->n;i++){
temp=data[i];
//按间隔inc来寻找插入点
for(j=i-inc;j>=0 && temp.key<data[j].key;j-=inc)
data[j+inc] = data[j];
data[j+inc] = temp;
}
}
}
//直接选择排序
void selectSort(SortObject *pvector){
int i, j ,k;
RecordNode temp, *data = pvector->record;
for(i=0;i<pvector->n-1;i++){
k = i;
for(j=i+1;j<pvector->n;j++)
if(data[j].key<data[k].key) k = j;
if(k!=j){
temp = data[i];
data[i] = data[k];
data[k] = temp;
}
}
}
//堆排序
void sift(SortObject *pvector, int size,int p){
RecordNode temp = pvector->record[p];
int child = 2*p+1;
while(child<size){
if((child<size-1) && (pvector->record[child].key < pvector->record[child+1].key))
child++;
if(temp.key < pvector->record[child].key){
pvector->record[p] = pvector->record[child];
p = child; child = 2*p+1;
}
else break;
}
pvector->record[p] = temp;
}
void heapSort(SortObject *pvector){
int i, n;
RecordNode temp;
n = pvector->n;
for(i=n/2-1;i>=0;i++) sift(pvector, n, i);
for(i=n-1;i>0;i--){
temp = pvector->record[0];
pvector->record[0] = pvector->record[i];
pvector->record[i] = temp;
sift(pvector, i, 0);
}
}