您的位置:首页 > 编程语言 > C语言/C++

选择排序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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: