㈠ 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