本文目录一览:
C语言直接选择排序运行失败
你的选择排序的函数传参,传错了,select_sort(a[8],8);应该是select_sort(a,8);
a[8]在C语言中是数组a的第9个元素,而a数组只有8个元素,所以你传了一个越界的数组元素,因此出运行错误
a在C语言中是数组a的第1个元素的指针,所以可以在函数中访问到整个a数组
还有函数的定义那一句void select_sort();应该改成 void select_sort(int a[],int n);
还有需要把if(min!=i)语句移到for-j循环外面,for-i循环里面
还有把printf("%d",a[i]); 改成printf("%d ",a[i]);每输出一个元素加一个空格
完整的C语言程序如下
#include stdio.h
void select_sort(int a[],int n);
int main(){
int i; int a[8];
printf("请输入8个整数,将为您从小到大排序。\n");
for(i=0;i8;i++) {
scanf("%d",a[i]);
}
select_sort(a,8);
for(i=0;i8;i++) {
printf("%d ",a[i]);
}
return 0;
}
void select_sort(int a[],int n){
int i,j,t,min;
for(i=0;in-1;i++) { //n-1次排序(移动)
min=i;
for(j=i+1;jn;j++) { //n-i次比较
if(a[min]a[j]) min=j;
}
if(min!=i){ //最小值不在i处的情况
t=a[min];
a[min]=a[i];
a[i]=t;
}
}
}
运行结果
请输入8个整数,将为您从小到大排序。
8 71 16 35 43 33 26 18
8 16 18 26 33 35 43 71
C语言编写程序,将一个一维数组的值按逆序重新存放。
#includestdio.h
int main()
{
int a[5]={8,6,5,4,1},i,n=5,temp;
for(i=0;in/2;i++)
{
temp=a[i];
a[i]=a[n-i-1];
a[n-i-1]=temp;
}
for(i=0;in;i++)
{
printf("%d\t",a[i]);
}
system("pause");
return 0;
}
扩展资料:
选择排序
主要思想就是,基本上默认数组中第一个元素为最大(最小)值,之后将这个元素和后面的每个元素都进行比较,以由大到小排序为例,当第一个值遇到比其大的,就进行交换。这样第一轮过后,第一位就是最大的。
接着进行第二轮,由第二个数开始逐个比较,遇到比第二个数大的进行交换,这样第二轮之后第二个数就是第二大的了,以此类推,不断进行选择,最后完成排序。
void selectSort(int numbers[], int length) {
for (int i = 0; i length; i++) {
for (int j = i + 1; j length; j++) {
if (numbers[i] numbers[j]) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
int myArray[] = {42, 7, 1, -3, 88};
int length = sizeof(myArray) / sizeof(myArray[0]);
selectSort(myArray, length);
for (int i = 0; i length; i++) {
printf("%i ", myArray[i]);
}
return 0;
}
当第一个数来比较的时候,i = 0,那么j应该等于i + 1,因为第一个数要和第二个数开始比,并且比较length - 1次;当i = 1时,j = 2,并且比较length - 2次,以此类推;上面写的是由大到小排序。
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。
C语言中通过函数调用对一维数组进行排序
#include stdio.h
#include stdlib.h
#include time.h
#define MAXlen 100
void select_sort(int *x, int n) { //选择排序
int i, j, min;
int t;
for (i = 0; i n - 1; i++) { // 要选择的次数:0~n-2共n-1次
min = i; // 假设当前下标为i的数最小,比较后再调整
for (j = i + 1; j n; j++) { //循环找出最小的数的下标是哪个
if (*(x + j) *(x + min)) {
min = j; // 如果后面的数比前面的小,则记下它的下标
}
}
if (min != i) { // 如果min在循环中改变了,就需要交换数据
t = *(x + i);
*(x + i) = *(x + min);
*(x + min) = t;
}
}
}
int main() {
int i;
int iArr[MAXlen];
srand((unsigned int)time(NULL));
printf("\n排序前:\n");
for(i = 0 ; i MAXlen ; i++) {
iArr[i] = (unsigned int)rand() % 1000;
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n");
select_sort(iArr,MAXlen);
printf("\n排序后:\n");
for(i = 0 ; i MAXlen ; i++) {
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n\n");
return 0;
}