本文目录一览:
C语言编程:选择法排序
选择排序是一种简单直观的排序算法。
工作原理:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
性能:
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
选择排序的时间复杂度是O(n^2)
思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
C语言版代码:
#include stdio.h
#include math.h
#define MAX_SIZE 101
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
void sort(int[], int); /* selection sort */
int main()
{
int i, n;
int list[MAX_SIZE];
printf("Enter the number of numbers to generate: ");
scanf_s("%d", n);
if (n 1 || n MAX_SIZE){
fprintf(stderr, "Improper value of n\n");
exit(1);
}
for (i = 0; i n; i++){ /* randomly generate numbers */
list[i] = rand() * 1000;
printf("%d ", list[i]);
}
sort(list, n);
printf("\n Sorted array:\n");
for (i = 0; i n; i++) /* print out sorted numbers */
printf("%d ", list[i]);
printf("\n");
return 0;
}
void sort(int list[], int n)
{
int i, j, min, temp;
for (i = 0; i n - 1; i++){
min = i;
for (j = i + 1; j n; j++)
if (list[j] list[min])
min = j;
SWAP(list[i], list[min], temp);
}
}
C语言选择排序法
这是选择排序。先用a[0]与a[1]比较,当a[0]a[1]时并不交换,而用k记下来现在a[0]最小……这样一趟比较完后a[k]就是整个数组中最小的元素,把它与a[0]交换;第二趟,从a[1]开始重复前面的操作,那么最后a[1]就是剩下的n-1个元素中最小的……看a[0]、a[1]已经由小到大排好了,当做完n-1趟时不就把整个数组都排好了吗?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;jn;j++)的循环体,要等它循环完了后才执行一次。
C语言 选择排序
void SelectSort(SSTable L)
{//对顺序表L做简单选择排序
int i,j,k,n;
SSTable元素类型 t; //不能只交换key,要整个结构进行交换
for(i=0;iL.length-1;i++) //循环范围变了
{
k=i;
for(j=i+1;j=L.length;j++)
{
if(L.R[j].keyL.R[k].key)
k=j;//k指向此趟排序中最小的记录
if(k!=i)
{
t=L.R[i];
L.R[i]=L.R[k];
L.R[k]=t;
}
for(n=0;nL.length;n++)
printf("%d ",L.R[n].key);
printf("\n");
}
}
}
c语言选择排序的程序代码
选择排序改进了冒泡排序,每次遍历列表只做一次交换,为了做到这一点,一个选择排序在遍历时寻找最大的值,并在完成遍历后,将其放到正确的地方。
第二次遍历,找出下一个最大的值。遍历n-1次排序n个项,最终项必须在n-1次遍历之后。
接下来呢,我们直接进行把最小值放到已排序序列末尾的操作。当然这是第一轮循环,还没有产生已排序的序列。0就是已排序序列的开头数字了。
第二轮初始化开始,我们继续选取假设的最小值,这次,我们还是选取第一个数字作为假设的最小值,需要注意的是,0已经是已排序序列,我们要从未排序的序列中选取第一个数字,也就是(5、1、8、6、2、3、4、9、7)无序序列中的数字5。
c语言怎样通过函数调用实现选择排序法
c语言通过函数调用实现选择排序法:
1、写一个简单选择排序法的函数名,包含参数。int SelectSort(int * ListData,int ListLength);
2、写两个循环,在循环中应用简单选择插入排序:
int SelectSort(int * ListData,int ListLength)
{
int i , j ;
int length = ListLength;
for(i=0;i=length-2;i++)
{
int k = i;
for(j=i+1;j=length-1;j++)
{
if(ListData[k]ListData[j])
{
k=j;
}
}
if(k!=i)
{
int tmp = ListData[i];
ListData[i] = ListData[k];
ListData[k] = tmp;
}
}
return 0;
}
3、对编好的程序进行测试,得出测试结果:
int main()
{
int TestData[5] = {34,15,6,89,67};
int i = 0;
printf("排序之前的结果\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
int retData = SelectSort(TestData,5);
printf("排序之后的结果:\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
return 0;
}
4、简单选择排序中,需要移动的记录次数比较少,主要的时间消耗在对于数据的比较次数。基本上,在比较的时候,消耗的时间复杂度为:n*n。