#include <stdio.h>
#include <stdlib.h>
typedef struct Elem
{
int a;
int b;
}Elem;
int issort(void *data, int size, int esize, int (*compare)(const void *key1, const void *key2))
{
char *a = data;
void *key;
int i,j;
if((key = (char *)malloc(esize)) == NULL)
return -1;
for(j = 1; j < size; ++j)
{
memcpy(key, &a[j * esize], esize);
i = j - 1;
while(i >= 0 && compare(&a[i * esize], key) > 0){
memcpy(&a[(i + 1) * esize], &a[i * esize], esize);
i--;
}
memcpy(&a[(i + 1) * esize], key, esize);
}
free(key);
return 0;
}
int compare_elem(const Elem *key1,const Elem *key2){
return (*key1).a > (*key2).a ? 1:-1;
}
int main(int argc, char *argv[])
{
Elem data[5]={{1,3},{45,4},{33,22},{66,44},{45,0}};
issort(&data, 5, sizeof(Elem), compare_elem);
for(int i = 0; i < 5; ++i)
{
printf("%d %d\n", data[i].a, data[i].b);
}
return 0;
}
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
设数组为a[0…n-1]。
1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
3. i++并重复第二步直到i==n-1。排序完成。
偏个题~用python实现下
#!/usr/bin/python
# -*- coding: utf-8 -*-
__author__ = 'kirchhoff'
def issort(list):
for i in range(1, len(list)):
key = list[i]
j = i - 1
while j >= 0 and list[j] > key:
list[j + 1] = list[j]
j -= 1
list[j + 1] = key
if __name__ == '__main__':
list = [3, 4, 6, 0, -4]
issort(list)
for i in list:
print i,