① c語言 排序 函數
一群菜鳥不懂的亂說。 我把樓主的代碼改了一些,如下 #include<stdio.h>int input(int data[], int argc, int *n)
{
int i;
printf("請輸入要輸入數的個數");
scanf("%d", n);
if(*n > argc) {
printf("segment fault!");
return -1;
}
for(i = 0; i < *n; i++) {
printf("輸入的第%d個數.", i+1);
scanf("%d", data+i); //canf("%d", &data[i]);
}
printf("輸入的數是:\n");
for(i = 0; i < *n; i++) {
printf("%5d\n", data[i]);
}
return 0;
}void sort(int n, int data[])
{
int i, j, temp;
for(i = 0; i < n-1; i++) {
for(j = i+1; j < n; j++)
if(data[i] < data[j]) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
printf("排序後的結果如下:\n");
for(i = 0; i < n; i++)
printf("%5d\n", data[i]);
}int main()
{
int data[100];
int n;
if(input(data, 100, &n) == -1)
return -1;
sort(n, data);
return 0;
}
對於以上代碼,做出如下解釋:(1)C語言的參數有形參和實參的說法,形參在傳遞到函數內的時候,復制一個副本給函數,在函數內部和外部是兩個完全不同的變數,函數結束,空間也被釋放,所以不能在函數內部來改變外部的值。所以要像樓主這樣用一個函數給一個變數賦值,要用實參int input(int data[], int argc, int *n)中的int *n就是實現形式,這種辦法把n的地址傳遞給函數。當然,在調用函數的時候也同樣要傳遞地址指針類型(&n)。(2)if(*n > argc) {
printf("segment fault!");
return -1;
}這一段是我加進去的,因為按照樓主的意思,data數組的長度也要傳遞進去,但是意思何在?所以只好加了這一段,並把函數改為有類型的,以檢驗是否有數據溢出。(3)scanf("%d", data+i); //scanf("%d", &data[i]);這里我改動的主要原因是為了提升程序速度,scanf("%d", &data[i]);同樣可以運行,但是定址一次,又回頭要地址,這樣繞了一圈,沒有必要。 對於樓主提幾點建議:(1)C語言的精髓在於指針,剛才說到的實參,就是用指針的概念實現的。scanf("%d", data+i); 一行,同樣也是把數組頭指針加上偏移地址,得到所要的地址。(2)C語言編程的時候特別要注意數據的溢出,這是所有初學者頭疼的問題之一。建議在一開始就養成習慣,經常檢驗數組的邊界。(3)void main一看就知道是看潭浩強的書長大的程序員。建議我們都用int main(){ return 0; }的形式,可以看看C語言之父K&R的書。主函數的返回值是告訴操作系統,這個函數是正常退出(返回0),還是異常退出(非0,經常是-1)。(4)在做實際項目的時候,程序經常是要回頭看的,也經常是要給別人看以達到維護的目的的。除了要養成良好的文檔書寫習慣以外(學習軟體工程以後你就會掌握),還要養成良好的編程風格,這里我建議看《thinking in C++》,並按照裡面例題的風格,養成自己的習慣。
② c語言順序查找法
如果是在已有n個元素的數組a中順序查找值為x的元素,以下是實現查找的函數代碼,查找成功則返回此元素的位置,否則返回-1:
int find(int a[],int n,int x)
{int i;
for(i=0;i<n&&a[i]!=x;i++);
return i<n?i:-1;
}
③ c語言順序查找
在這個程序中,輸入的10個數字,是以空格 隔開的。如果想用逗號隔開,會比較麻煩。
既然上面是空格隔開的,下面倒數第三行printf("%d in %d",key,i);key和i用空格隔開不用逗號是不行的。這是程序語句規定的,各輸出項之間必須要用逗號分隔。這個與上面所說的運行時輸入各數據用什麼分隔(它是可以指定的)是兩碼事。
④ C語言,輸入一組數進行排序,由大到小排列,用自定義函數實現
給你一個直接插入排序
#include "stdio.h"
void InsertSort(int a[], int left, int right) {//對數組a從下標為left到right區域進行直接插入排序
int i, j, tmp;
for(i = left + 1; i <= right; i++) {
for(j = i - 1, tmp = a[i]; j >= left && tmp > a[j]; j++)
a[j + 1] = a[j];
a[j + 1] = tmp;
}
}
void main( ) {
int i, n, a[100];
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
InsertSort(a, 0, n - 1);
printf("\n");
for(i = 0; i < n; i++) printf("%d\t", a[i]);
}
⑤ C語言查找函數
int Revieve(int array[], int length, int x)
{
int i =0; // 是數組的下表
for (i=0; i<length; i++) //循環
{
if (array[i] == x) // 如果是x, 則表示是要找的數, 返回 i , 是x的下表
{
return i;
}
}
return -1; // 沒有則返回 -1
}
⑥ c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
⑦ C語言中的排序函數是什麼
include <cstdlib> 或 #include <stdlib.h>
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
參數表
*base: 待排序的元素(數組,下標0起)。
num: 元素的數量。
width: 每個元素的內存空間大小(以位元組為單位)。可用sizeof()測得。
int(*)compare: 指向一個比較函數。*elem1 *elem2: 指向待比較的數據。
比較函數的返回值
返回值是int類型,確定elem1與elem2的相對位置。
elem1在elem2右側返回正數,elem1在elem2左側返回負數。
控制返回值可以確定升序/降序。
產生隨機數的函數也是rand(),不是rank().
⑧ C語言數組的查找函數
#include<stdio.h>
int main()
{
int a[5];
int i,max,min;
printf("input number:\n");
for(i=0;i<5;i++)
scanf("%d",&a[i]);
max=a[0];
min=a[0];
for(i=0;i<5;i++){
if(a[i]>max)
max=a[i];
}
for(i=0;i<5;i++){
if(a[i]<min)
min=a[i];
}
for(i=0;i<5;i++){
printf("%d",a[i]);
printf(" ");
}
printf("\n");
printf("最大值為%d\n",max);
printf("最小值為%d\n",min);
return 0;
}
⑨ C語言查找的用法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineN20
voidSort(inta[],intn){
inti,j,k,t;
for(i=0;i<n-1;++i){
k=i;
for(j=i+1;j<n;++j){
if(a[k]>a[j])k=j;
}
if(i!=k){
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
}
intFind(inta[],intn,intx){
intlow=0,high=n-1,mid;
while(low<=high){
mid=(low+high)/2;
if(x==a[mid])returnmid;
elseif(x>a[mid])low=mid+1;
elsehigh=mid-1;
}
return-1;
}
voidShow(inta[],intn){
inti;
for(i=0;i<n;++i){
printf("%d",a[i]);
}
printf(" ");
}
intmain(){
inta[20],i,x,res;
srand((unsigned)time(NULL));
for(i=0;i<N;++i)
a[i]=rand()%N;//每個數都在1--100之間
Show(a,N);
Sort(a,N);
Show(a,N);
x=rand()%100+1;
res=Find(a,N,x);
if(res>=0)printf("數值%d的下標為%d。 ",a[res],res);
elseprintf("數列中沒有找到數值%d。 ",x);
return0;
}