1. 快速排序算法
[Accepted 2013/03/12]
void quick_sort(int data[], int low, int high) { //对data[]做快速排序
int pivoc = 0;
if(low < high) { //长度大于1
pivoc = patition(data, low, high); //将data[]一分为二
quick_sort(data, low, pivoc - 1); //快速排序左边
quick_sort(data, pivoc + 1, high); //快速排序右边
}
}
int patition(int data[], int low, int high) { //将data[]一分为二
int m = 0;
int i = 0;
int j = 0;
int temp = 0;
m = data[low]; //记录基准的值
if(low < high) {
i = low;
j = high + 1;
do {
do {
i = i + 1;
}while(data[i] < m && i < high);
do {
j = j - 1;
}while(data[j] > m && j > low);
temp = data[i]; //交换data[i]和data[j]
data[i] = data[j];
data[j] = temp;
}while(i < j);
temp = data[i]; //交换data[i]和data[j]
data[i] = data[j];
data[j] = temp;
temp = data[j]; //交换data[low]和data[j]
data[j] = data[low];
data[low] = temp;
}
return j; //返回j
}
Well done !
Every morning, you and sunshine ~
2. 以“Move-to-Front” 方式编写一个动态线性查找表
[Acceptd: 2013/03/12]
struct node* insert(struct node* head, int temp) {
int flag = 0;
struct node* q = NULL;
struct node* p = NULL;
struct node* p_pre = NULL;
if(head == NULL) { //head为空 直接返回q
q = make_node(temp);
return q;
}
p = p_pre = head;
if(p->data == temp) return head; //temp与第一个数据相等 返回head
p = p->next;
while(p != NULL) {
if(p->data == temp) { //遍历链表查找temp数据
flag = 1;
break;
}
p_pre = p;
p = p->next;
}
if(flag == 1) { //链表中存在temp数据, 将该节点放在头部
p_pre->next = p->next;
p->next = head;
head = p;
}
else { //链表中不存在temp数据,新建节点,并放在头部
q = make_node(temp);
q->next = head;
head = q;
}
return head;
}
struct node* make_node(int temp) //建立新节点
{
struct node* q = NULL;
q = (struct node*)malloc(sizeof(struct node));
if(q == NULL) {
printf("Allocation fails!");
exit(-1);
}
q->data = temp;
q->next = NULL;
return q;
}
void print(struct node* head) { //打印链表
struct node* p = head;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int temp = 0;
FILE* fp = NULL;
char file_name[50] = "data.txt";
struct node* head = NULL;
if((fp = fopen(file_name, "r")) == NULL) {
printf("File open error!");
exit(-1);
}
while(!feof(fp)) {
fscanf(fp, "%d", &temp); //读取data
head = insert(head, temp); //插入节点
print(head); //打印链表
}
return 0;
}
3. 以“Move-One-Step” 方式编写一个动态线性查找表
[Accepted: 2013/03/13]
struct node* insert(struct node* head, int temp) {
int flag = 0;
struct node* p = NULL;
struct node* q = NULL;
struct node* p_pre = NULL;
if(head == NULL) {
q = make_node(temp);
return q;
}
p = head;
while(p != NULL) {
if(p->data == temp) {
flag = 1;
break;
}
p_pre = p;
p = p->next;
}
if(flag == 0) {
q = make_node(temp);
q->next = head;
return q;
}
if(p_pre != NULL) {
p->data = p_pre->data;
p_pre->data = temp;
}
return head;
}
struct node* make_node(int temp)
{
struct node* q = NULL;
q = (struct node*)malloc(sizeof(struct node));
if(q == NULL) {
printf("Allocation fails!");
exit(-1);
}
q->next = NULL;
q->data = temp;
return q;
}
void print(struct node* head) {
struct node* p = NULL;
p = head;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void free_list(struct node* head) {
struct node* p = NULL;
struct node* q = NULL;
p = head;
while(p != NULL) {
q = p->next;
free(p);
p = q;
}
}
int main() {
int temp = 0;
FILE* fp = NULL;
char file_name[50] = "data.txt";
struct node* head = NULL;
if((fp = fopen(file_name, "r")) == NULL) {
printf("File open error!");
exit(-1);
}
while(!feof(fp)) {
fscanf(fp, "%d", &temp);
head = insert(head, temp);
print(head);
}
free_list( head);
fclose(fp);
return 0;
}
速度越来越快啦,(*^__^*) 嘻嘻……
本周加试一题:
4.(附加题) 编程判断一个有限单向链表是否含有一个环(节点数未知)。
[Accepted 2013/03/21]
bool is_loop(struct node* head) { //判断环是否存在
struct node* fast = head;
struct node* slow = head;
if(head == NULL) {
printf("The link is empty!\n");
return false;
}
if(head->next == NULL) return false;
while(1) {
slow = slow->next;
if(slow == NULL) return false;
fast =fast->next;
if(fast == NULL) return false;
fast =fast->next;
if(fast == NULL) return false;
if(fast == slow) return true;
}
}