㈠ c语言数组排序
这个不是排序,而是逆序输出,没学过链表用自动增长的栈来实现好了,
只要内存够大,可以输入任意个整数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INC_SIZE 5 /* 每次栈自动增长的大小 */
/* 栈结构 */
typedef struct INTEGER_STACK
{
int* value;
int size; /* 栈大小 */
int pos; /* 栈顶位置 */
} Stack;
/* 初始化栈 */
void initialize(Stack* s)
{
if (s->size <= 0)
s->size = INC_SIZE;
s->value = (int*)malloc(sizeof(int) * s->size); /* TODO: error check */
s->pos = -1;
}
/* 销毁 */
void destroy(Stack* s)
{
free(s->value);
s->value = NULL;
s->size = 0;
}
/* 扩充栈 */
void expand(Stack* s, int new_size)
{
if (new_size > s->size)
{
s->value = (int*)realloc(s->value, sizeof(int) * new_size); /* TODO: error check */
s->size = new_size;
}
}
/* 入栈 */
void push(Stack* s, int i)
{
if (s->pos >= s->size - 1)
expand(s, s->size + INC_SIZE);
s->value[++(s->pos)] = i;
}
/* 出栈 */
int* pop(Stack* s)
{
if (s->pos >= 0)
return &(s->value[s->pos--]);
else
return NULL;
}
/* 是否为空栈 */
int is_empty(Stack* s)
{
return s->pos < 0;
}
/* 测试程序 */
int main()
{
Stack stack;
stack.size = 5;
initialize(&stack);
/* 输入数组 */
printf("输入整数数组,每行一个整数, 用 end 结束:\n");
while (1)
{
char buf[128];
scanf("%s", buf);
if (strcmp(buf, "end") == 0)
break;
else
push(&stack, atoi(buf));
}
printf("\n");
/* 逆序输出 */
do
{
int* i = pop(&stack);
if (i == NULL)
break;
printf("%d", *i);
if (!is_empty(&stack))
printf(" ");
}
while (1);
destroy(&stack);
return 0;
}
㈡ C语言(数组排序)
1.选择排序思想:假定按从大到小排序,比较数组中所有数的大小,挑出最大的元素将其与第一个元素交换位置,然后比较除第一个元素外其他各元素的大小,挑出最大的元素与第二个元素交换位置,依此类推,完成排序。
2.给你解释开头的n-2:k=0 to k=n-2,k总共取n-1个元素,当k=n-2时,对应a[n-2]为数组倒数第二个元素,此时i=n-i,a[i]即a[n-1]对应数组最后一个元素,当比较完a[n-2]和a[n-1]并排序后,整个数组就完成了排列。
3.代码:
for(k=0;k<=n-2;k++)
{
index=k;
for(i=k+1;i<=n-1;i++)
{
if(a[i]<a[index])
{
index=i;
}
}
temp=a[k],a[k]=a[index],a[index]=temp;
}
㈢ C语言,数组排序
min=i; //假设i是最小的
for(j=i+1;j<=8;j++) //遍历i之后的元素
if(a[min]>a[j]) //还有比a[i]小的元素?
min=j; //有,记住这个元素的编号
temp=a[i]; //下面3行,交换最小的元素和第i个元素,使a[i]是最小的
a[i]=a[min]; //这里你可以判断一下,如果min==i就不用交换。
a[min]=temp;
㈣ C语言 数组排序
void sort(int a[],int n)
{
for(int i=0;i<n;i++) //定义应该放在开始位置,还有,这里i<n-1
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
int temp; //这个定义也应放在开始
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
void exe5()
{
int a[10];
for(int i=0;i<10;i++) //这里的定义
scanf("%d",a[i]);
sort(a,10);
for(i=0;i<10;i++)
printf("%d|",a[i]); //这里为什么用long型,你定义的是int型啊
}
㈤ C语言数组选择排序法,超简单,求解
for语句有4个部分内容for ( A;B;C ) D;其中A是初始化语句,每个for只执行A一次,B是循环条件,每次循环前执行判断,如果不满足则结束循环,D是在满足循环条件时执行的,可以是一句或多句(多句时用大括号括起来做整体处理),C是在执行D之后进行的后续处理。for语句执行的顺序是:A,B,D,C,B,D,C,B,D,C,...,B结束
for(i=0;i<9;i++){
iTemp=a[i];iPos=i;
for(j=i+1;j<10;j++){
if(a[j]<iTemp){iTemp=a[j];iPos=i;}
}
a[iPos]=a[i];a[i]=iTemp;
}
假设数组a中输入了十个数为:1,2,5,4,6,8,7,9,10,3,通过手动单步执行程序(把自己当成计算机),分析理解for语句的含义。
i=0;[i=0],i<9成立,开始循环
iTemp=a[i];[iTemp=a[0]=1],iPos=i;[iPos=0]
j=i+1;[j=0+1=1],j<10成立,开始循环:a[j]<iTemp不成立[a[j]=a[1]=2,2<1不成立],跳过不执行
j++;[j=2],j<10成立,继续循环:a[j]<iTemp不成立[5<1],跳过不执行
j++;[j=3],j<10成立,继续循环:a[j]<iTemp不成立[4<1],跳过不执行
j++;[j=4],j<10成立,继续循环:a[j]<iTemp不成立[6<1],跳过不执行
...//没有条件满足让if语句条件能得到执行,因为a[1]~a[9]都不小于iTemp
j++;[j=10],j<10不成立,结束循环
a[0]=a[0];a[0]=1;实际上a[0]值未变,通过以上处理a[0]保存a[0]之后所有数组中最小值
i++;[i=1],i<9成立,继续循环
iTemp=a[i];[iTemp=a[1]=2],iPos=i;[iPos=1]
j=i+1;[j=2],j<10成立,开始循环:a[j]<iTemp不成立[5<2],跳过不执行
j++;[j=3],j<10成立,继续循环:a[j]<iTemp不成立[4<2],跳过不执行
...//没有条件满足让if语句条件能得到执行,因为a[2]~a[9]都不小于iTemp
j++;[j=10],j<10不成立,结束循环
a[1]=a[1];a[1]=2;实际上a[1]值未变,通过以上处理a[1]保存a[1]之后所有数组中最小值
i++;[i=2],i<9成立,继续循环
iTemp=a[i];[iTemp=a[2]=5],iPos=i;[iPos=2]
j=i+1;[j=3],j<10成立,开始循环:a[j]<iTemp成立,iTemp=a[j];[iTemp=4],iPos=j;[iPos=3]
j++;[j=4],j<10成立,继续循环:a[j]<iTemp不成立[6<4],跳过不执行
...
j++;[j=9],j<10成立,继续循环:a[j]<iTemp成立,,iTemp=a[j];[iTemp=3],iPos=j;[iPos=9]
j++;[j=10],j<10不成立,结束循环
a[9]=a[2];a[2]=3;通过以上处理a[2]与a[2]之后所有数组中最小值的a[9]值互换
现在数组变成:1,2,3,4,6,8,7,9,10,5
...//每次i循环都会导致当前a[i]与之后最小值的元素互换值,结果是a[i]保存之后最小值
i++;[i=9],i<9不成立,结束循环
至此数组按照从小到大顺序排序
上述循环中,i值指定当前要处理的元素,j值负责每次提供之后所有元素下标,在进行比较后,当前i指向元素会与之后最小值进行交换,保证当前元素是之后元素中最小的,从而进行9次这样的处理后数组按顺序已经排好序了。
㈥ C语言 数组排序
你定义的数组a[11]是11个数,但是你只初始化了0~9,a[10]由于你没有初始化所以是0
你的排序也把这个0排进去了。
你试试定义那里写a[11]=={1,10,20,30,40,50,60,70,80,90,100};就肯定不会有0了
㈦ C语言数组排序方法
选择排序的原理是,每次从待排序数字中挑选出最大(最小)数字,放在有序序列的末尾。实际操作中,只需要在这个数组中将挑出来的数字与前面的数字交换即可。例如:4
1 5
2 3找到最小的1,1和4交换1
4 5
2
3找到最小的2,2和4交换1
2
5
4
3找到最小的3,3和5交换1
2
3
4
5找到最小的4,4和4交换(不交换也可)可见,选择排序需要一个双重循环来完成,因此它的复杂度是O(n^2)在数据量比较大时,不建议使用这种排序方法。 其他排序方法有很多,你甚至可以自己根据不同数据规模设计不同的排序方法。比较常见的有冒泡排序,插入排序(这两种和选择排序一样,都是O(n^2)),二分法插入排序(降低了一些复杂度,但是涉及到大规模数据移动,效率依然不高),快速排序(平均复杂度O(nlogn),但是不稳定,最坏情况O(n^2)),随机化快速排序(很大程度上避免了最坏情况的出现),堆排序(O(nlogn),编程复杂度高),基数排序(理论复杂度O(n),实际要比这个慢。甚至能应付字符串排序,但是编程复杂度高,牵扯到其他数据结构),桶排序(O(n),编程简单,效率高,但是应付的数据范围不能太大,受到内存大小的限制)。 平时比较常用的就是快速排序,程序简单,效率也可以接受。 这是我了解的一些东西,希望对你有帮助。
㈧ 求C语言将数组元素大小排序!!
C语言将数组元素大小排序方法:
以下使用的是冒泡排序法实线数组从小到大排序。
思想:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
10、2、3、4、5、6、9、8、7、1是输入的待排序的数列,经过第一次排序,将最大的,10放在最后,第二次排序,将剩下的2、3、4、5、6、9、8、7、1进行冒泡,将当前最大的9放在倒数第二的位置,以此类推。
以下是具体代码:
#include <stdio.h>
int main(){
int nums[10] = {10, 2, 3, 4, 5, 6, 9, 8, 7, 1};
int i, j, temp, isSorted;
//优化算法:最多进行 n-1 轮比较
for(i=0; i<10-1; i++){
isSorted = 1; //假设剩下的元素已经排序好了
for(j=0; j<10-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
isSorted = 0; //一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了
}
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf(" ");
return 0;
}
(8)c语言数组排序小结扩展阅读:
其他将数组从小到大排序的算法
以下使用的是选择排序法实现数组从小到大排序。
思想:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置
输入的序列为10、2、3、4、5、6、9、8、7、1进行一次排序后将最小的数放在了第一位(a[0]与它后面的所有数进行比较,若a[0]比后面的数大,进行交换),以此类推。
以下是具体代码:
#include <stdio.h>
int main(void){
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}
㈨ C语言编程数组排序
c语言数组排序小结
http://wenku..com/view/7073306a25c52cc58bd6be17.html