选择排序C语言实现
2015-01-11 00:14
148 查看
基本思想:带排序内容被分为有序和无序两部分,每次找出无序部分最小元置于无序子列表首,然后有序子列表尾后移一位,无序子列表首后移一位。
首先是数组的选择排序
然后是链表的选择排序,个人更喜欢插入排序
首先是数组的选择排序
/* 允许重复 */ void selectionSort(int a[], int len) { for(i=0; i < len-1; i++){ for(j=i,k=i+1; k < len; k++) /* 找到无序部分最小元 */ if(a[j] > a[k]) j = k; temp = a[i]; /* 把最小元交换至无序部分开头 */ a[i] = a[j]; a[j] = temp; } } /* 不允许重复 */ void selectionSort(int a[], int *len) { for(i=0; i<*len-1; i++){ for(j=i,k=i+1; k<*len; k++){ if(a[j] > a[k]) j=k; if(a[j] == a[k]){ for(r=k; r<*len-1; r++) a[r] = a[r+1]; *len--; k--; } } temp = a[i]; a[i] = a[j]; a[j] = temp; } }
然后是链表的选择排序,个人更喜欢插入排序
struct Node{ int value; struct Node *next; }; /* 允许重复,无辅助表元 */ struct Node *selectionSort(struct Node *head) { struct Node *premin, *min, *cur, *precur, *tail; if(head == NULL) return NULL; tail = premin = NULL; /* tail指向有序部分末节点,初始为空 */ min = head; /* min存放最小节点的地址,初始为首表元 */ while(min->next != NULL){ /* 无序部分只剩下一个节点时结束循环 */ for(precur=premin,cur=min->next; cur!=NULL; precur=cur,cur=cur->next){ /* cur指针用来遍历无序部分 */ if(min->value>cur->value){ premin = precur; min = cur; } } if(tail == NULL){ if(min != head){ premin->next = min->next; min->next = head->next; head = min; } premin = tail = head; min = tail->next; }else{ if(min != tail->next){ premin->next = min->next; min->next = tail->next; tail->next = min; } premin = tail = tail->next; min = tail->next; } } return head; } /* 不允许重复,无辅助表元 */ struct Node *selectionSort(struct Node *head) { struct Node *premin, *min, *cur, *precur, *tail; if(head == NULL) return NULL; tail = premin = NULL; /* tail指向有序部分末节点,初始为空 */ min = head; /* min存放最小节点的地址,初始为首表元 */ while(min->next != NULL){ /* 无序部分只剩下一个节点时结束循环 */ for(precur=premin,cur=min->next; cur!=NULL; precur=cur,cur=cur->next){ /* cur指针用来遍历无序部分 */ if(min->value>cur->value){ premin = precur; min = cur; } } if(tail == NULL){ if(min != head){ premin->next = min->next; min->next = head->next; head = min; } premin = tail = head; min = tail->next; }else{ if(min != tail->next){ if(tail->value != min->value){ premin->next = min->next; min->next = tail->next; tail->next = min; premin = tail = tail->next; min = tail->next; }else{ premin->next = min->next; min = tail->next; } } } } return head; }
相关文章推荐
- 数据结构--快速、冒泡、选择排序C语言实现
- 选择排序C语言实现
- 选择排序C语言实现
- 选择排序c语言实现
- 如何利用C++ Builder 4.0 Enterprise实现对Excel97 的调用
- 应用程序敏感键的实现
- 在PB中快速实现数据库树形结构
- 在PowerBuilder中实现菜单条级权限的设置
- PB7.0中实现Jaguar GTS组件开发
- 用Delphi实现远程屏幕抓取
- 如何实现数据的自动录入
- 利用Hook技术实现键盘监控
- 用Delphi实现远程屏幕抓取
- 用CTI实现与Web交谈
- WebClass实现动态WEB编程之理论篇
- WebClass实现动态WEB编程之实践篇
- 如何实现win9X进程间数据通讯技术
- 用canvas实现红心飘飘的动画效果
- 串行通信的基本原理及用MFC实现串口通信编程
- 如何在应用程序中实现关机功能