當前位置:首頁 » 編程語言 » c語言n個數排序4種方法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言n個數排序4種方法

發布時間: 2023-02-13 03:15:19

1. 排序演算法c語言n個數字的排序

我近期做練習的時候專門為排序做了一個c程序,你看看怎麼樣,包括了很多排序方法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10
//初始化數組
void init(int *arr,int len);
//列印數組元素
void print(int *arr,int len);
//列印堆元素
void printH(int *arr,int len);
//交換兩個整數的值
void swap(int &a,int &b);
//簡單插入排序
void inserts(int *arr,int len);
//冒泡排序
void bubbles1(int *arr,int len);
//簡單選擇排序
void selects(int *arr,int len);
//快速排序
void quicks(int *arr,int low,int high);
//希爾排序
void shells(int *arr,int len);
//歸並
void merge(int *a,int len1,int *b,int len2,int *c);
int main()
{
int arr[LEN],brr[LEN],crr[2*LEN];
srand((unsigned)time(NULL));
init(arr,LEN);
print(arr,LEN);
bubbles1(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
selects(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
inserts(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
quicks(arr,0,LEN);
print(arr,LEN);
init(arr,LEN);
init(brr,LEN);
print(arr,LEN);
print(brr,LEN);
shells(arr,LEN);
shells(brr,LEN);
merge(arr,LEN,brr,LEN,crr);
print(crr,2*LEN);
return 0;
}
//初始化數組
void init(int *arr,int len)
{
int i;
for(i=0;i<len;i++)
{
arr[i]=rand()%1000;
}
}
//列印數組元素
void print(int *arr,int len)
{
int i;
printf("\n");
for(i=0;i<len;i++)
printf("%4d ",arr[i]);
printf("\n");
}
//列印堆元素
void printH(int *arr,int len)
{
int i;
printf("\n");
for(i=0;i<len;i++)
printf("%4d ",arr[i]);
printf("\n");
}
//交換兩個整數的值,^功能為異或,相同0,相異1
void swap(int &a,int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
//插入排序
void inserts(int *arr,int len)
{
int i,j,temp;
for(i=1;i<len;i++)
{
temp=arr[i];
for(j=i-1;j>=0&&arr[j]>temp;j--)
arr[j+1]=arr[j];
arr[j+1]=temp;
}
}
//冒泡排序
void bubbles1(int *arr,int len)
{
int i,j,exchange;
exchange=0;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1]);
exchange=1;
}
}
if(!exchange)
break;
}
}
//簡單選擇排序
void selects(int *arr,int len)
{
int i,j,temp;
for(i=0;i<len-1;i++)
{
temp=i;
for(j=i+1;j<len;j++)
{
if(arr[j]<arr[temp])
{
temp=j;
}
}
if(temp!=i)
{
swap(arr[temp],arr[i]);
}
}
}
//快速排序
void quicks(int *arr,int low,int high)
{
int temp,l,r;
if(low<high)
{
l=low;
r=high;
temp=arr[low];
while(low<high)
{
while(low<high&&arr[high]>=temp)
high--;
if(low<high)
arr[low]=arr[high];
while(low<high&&arr[low]<=temp)
low++;
if(low<high)
arr[high]=arr[low];
}
arr[low]=temp;
quicks(arr,l,low-1);
quicks(arr,low+1,r);
}
}
//希爾排序
void shells(int *arr,int len)
{
int i,j,gap;
for(gap=len/2;gap>0;gap/=2) //步長
for(i=gap;i<len;i++)
for(j=i-gap;j>=0&&arr[j]>arr[j+gap];j-=gap)
swap(arr[j],arr[j+gap]);
}
//兩有序數組合並
void merge(int *a,int len1,int *b,int len2,int *c)
{
int i=0,j=0,k=0;
while(i<len1&&j<len2)
{
if(a[i]<=b[j])
{
c[k]=a[i];
k++;
i++;
}
else
{
c[k]=b[j];
k++;
j++;
}
}
if(i<len1)
c[k++]=a[i++];
else if(j<len2)
c[k++]=b[j++];
}

2. C語言編程,利用對n個整數進行排序

因為你i<=n,a[n]里放的是垃圾值

3. C語言 對n個整數進行排序(動態內存分配)

#include <stdio.h>
#include <stdlib.h>

int main()
{
int m,n;
printf("please input the length of the array:\n");
scanf("%d",&m);
int* arr=(int *)malloc(m*sizeof(int));

for(n=0;n<m;n++)
{
scanf("%d",arr+n);
}

int i,j;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
if(arr[j]>arr[i])
{
double tmp;
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}

for(i=0;i<m;i++)
printf("%d\n",arr[i]);
return 0;
}

4. C語言對N個數進行排序

!!!!!!!!
!!!!!!!!
!!!!!!!!
註:c語言中可以將數組長度定義為變數,只是這種方法在vs中編譯不能通過,但在更為標準的dev中以及gcc中完全可以編譯通過!
一定要給分啊!自己寫的!
#include"stdio.h"
#include"conio.h"
int
main()
{
int
length;
printf("請輸入要排序的數字個數:\n");
scanf("%d",&length);
int
data[length],i;
void
mbquicksort(int
*imput,int
start,int
end);
printf("請依次輸入這些數字,以空格分隔:\n");
for(i=0;i
=x))++start;
imput[end]=imput[start];
}
imput[start]=x;
mbquicksort(imput,start,start-1);
mbquicksort(imput,start+1,end);
}
}

5. (數據結構)隨機產生n個數,用4種方法排序,比較各種排序的效率

#ifndef sort_h //(作用:防止h被重復引用)
#define sort_h
#include <iostream>
using namespace std;
void slook(int*main,int len)
{
for(int i=0;i<len;i++)cout<<main[i]<<" ";
cout<<endl;
}

//冒泡排序
void bb_sort( int*main,int len)
{
int temp;
for(int j=0;j<len;j++)
{
for(int i=0;i<len-j-1;i++)
{
if(main[i]>main[i+1])
{
temp=main[i];
main[i]=main[i+1];
main[i+1]=temp;
}
}
}
}
//直接插入排序
void insert_sort(int *main,int len)
{int temp;
for(int j=1;j<len;j++)
{
for(int i=j;i>0;i--)
if(main[i]<main[i-1])
{
temp=main[i-1];
main[i-1]=main[i];
main[i]=temp;
}
}
}
//折半插入排序
void bi_insert_sort(int *main,int len)
{
int temp;
for(int j=1;j<len;j++)
{
for(int i=j;i>0;i--)
{
if(main[i]<main[i-1])
{
int head=0;
int rear=i;
for(int mid;head<rear;)
{
mid=(rear+head)/2;
if(main[mid] >=main[i]) rear=mid;
else head=mid+1;
}
temp=main[i];
int k=i;
for(;k>head;k--)
{
main[k]=main[k-1];
}
main[head]=temp;
}}
}

}
//快速里分二分之一的程序段
int partition(int *main,int low,int high)
{
main[0]=main[low];
int e=main[low];
while(low<high)
{
while(low<high && main[high]>=e)--high;
main[low]=main[high];
while(low<high && main[low]<=e)++low;
main[high]=main[low];
}
main[low]=main[0];
return low;
}
//快速排序
void kqsort(int *main,int low,int high)
{
if(low<high)
{
int e=partition(main,low,high);
kqsort(main,low,e-1);
kqsort(main,e+1,high);
}
}

bool sort()
{
cout<<endl<<"~~~~歡迎進入排序~~~"<<endl;
int len;
int *main;
cout<<endl<<"請輸入元素個數"<<endl;
cin>>len;
error(len);
main=(int*)malloc(len*sizeof(int));
for(int i=0;i<len;i++)
{
cout<<"請輸入第"<<i+1<<"個元素的數值:"<<endl;
cin>>main[i];
error(main[i]);
}
int menu=-1;
while(menu!=0)
{

cout<<"查看原數組,請按-->1"<<endl;
cout<<"進入「直接插入排序」請按-->2"<<endl;
cout<<"進入「折半插入排序」請按-->3"<<endl;
cout<<"進入「冒泡排序」請按-->4"<<endl;
cout<<"進入「快速排序」請按-->5"<<endl;
cout<<"隨機生成3000個元素判斷查找速度,請按-->6"<<endl;
cout<<"退出請按-->0"<<endl;
cin>>menu;
error(menu);
cout<<endl;
if(menu>6||menu<0)cout<<endl<<"\a您輸入錯誤,請重新輸入"<<endl<<endl;

else{

switch(menu)
{
case 1:
slook(main,len);
break;
case 2:
insert_sort(main,len);
slook(main,len);
break;
case 3:
bi_insert_sort(main,len);
slook(main,len);
break;
case 4:
bb_sort(main,len);
slook(main,len);
break;
case 5:
int* mai=(int*)malloc((len+1)*sizeof(int));
for(int i=len+1;i>1;i--)mai[i]=main[i-1];
kqsort(mai,0,len);
slook(mai,len);
for(int i=len+1;i>1;i--)main[i-1]=mai[i];

}
}}

return 0;
}
#endif

6. c語言 若對任意n個數進行排序,應該如何操作

/*選擇排序法:從小到大排列10個數並輸出*/
#include<stdio.h>
#defineN10//可修改輸入個數
voidmain()
{
inti,a[N],t,j;
for(i=0;i<N;i++)scanf("%d",&a[i]);//輸入
for(j=1;j<N;j++)//N次比較
for(i=0;i<j;i++)//每趟中比j次
if(a[i]>a[j])//與a[i]後面的元素進行比較
{
t=a[i];a[i]=a[j];a[j]=t;
}
printf("排序後: ");
for(i=0;i<N;i++)printf("%d",a[i]);
printf(" ");
}


7. c語言 數據結構 利用隨機函數產生N個隨機整數,對這些數進行多種方法進行排序

srand(time(NULL)); //產生隨機數
for(i = 0; i < n; i++)
a[i] = rand()%(n - i);

extern void insert(int a[], int x) //插入排序
{
int i;
int n;
int j;
int temp;
n = x;
for(i = 1; i < n; i++)
{
temp = a[i];
j = i - 1;
while(temp < a[j] && j >= 0)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}

static void shellsort(int a[], int d, int x)
{
int i;
int j;
int n;
int temp;
n = x;
for(i = d; i < n; i += d)
{
temp = a[i];
j = i - d;
while(a[j] > temp && j >= 0)
{
a[j + d] = a[j];
j -= d;
}
a[j + d] = temp;
}
}
extern void shell(int a[], int x) //希爾排序
{
int n;
int d;
n = x;
d = n / 2;
while(d > 0)
{
shellsort(a, d, n);
d /= 2;
}
}

extern void bubble(int a[], int x) //冒泡排序
{
int ischange;
int i;
int j;
int n;
n = x;
for(i = n - 1; i > 0; i--)
{
ischange = 0;
for(j = 0; j < i; j++)
{
if(a[j + 1] < a[j])
{
a[j + 1] += a[j];
a[j] = a[j + 1] - a[j];
a[j + 1] = a[j + 1] - a[j];

ischange = 1;
}
}
if(0 == ischange)
{
break;
}
}
}

static int partion(int a[], int left, int right)
{
int l;
int r;
int priv;
l = left;
r = right;
priv = a[l];
while(l < r)
{
while(a[r] > priv && r > l)
r--;
if(l < r)
{
a[l++] = a[r];
}
while(a[l] < priv && r > l)
l++;
if(l < r)
{
a[r--] = a[l];
}
}
a[l] = priv;
return l;
}

static void quicksort(int a[], int left, int right)
{
int l;
int r;
int priv;
l = left;
r = right;
if(l < r)
{
priv = partion(a, l, r);
quicksort(a, l, priv - 1);
quicksort(a, priv + 1, r);
}
}
extern void quick(int a[], int n) //快速排序
{
int l;
int r;
l = 0;
r = n - 1;
quicksort(a, l, r);
}

extern void selec(int a[], int x) //選擇排序
{
int i;
int j;
int k;
int n;
n = x;
for(i = 0; i < n; i++)
{
k = i;
for(j = i; j < n; j++)
{
if(a[j] < a[k])
{
k = j;
}
}
if(i != k)
{
a[i] += a[k];
a[k] = a[i] - a[k];
a[i] -= a[k];
}
}
}

static void mergearray(int a[], int first, int mid, int last, int p[])
{
int i;
int j;
int k;
i = first;
j = mid + 1;
k = 0;
while(i <= mid && j <= last)
{
if(a[i] <= a[j])
{
p[k++] = a[i++];
}
else
{
p[k++] = a[j++];
}
}
while(i <= mid)
{
p[k++] = a[i++];
}
while(j <= last)
{
p[k++] = a[j++];
}

for(i = 0; i < k; i++)
{
a[first + i] = p[i];
}
}

static void mergesort(int a[], int first, int last, int p[])
{
int mid;
if(last > first)
{
mid = first + (last - first) / 2;
mergesort(a, first, mid, p);
mergesort(a, mid + 1, last, p);
mergearray(a, first, mid, last, p);
}
}

extern void merge(int a[], int n) 歸並排序
{
int *p;
p = (int *)malloc(n * sizeof(int));
if(!p)
{
perror("malloc");
exit(-1);
}
mergesort(a, 0, n - 1, p);
free(p);
}

static void swap(int data[], int a, int b)
{
data[a] ^= data[b];
data[b] ^= data[a];
data[a] ^= data[b];
}

static void siftup(int data[], int n) // create heap
{
int i;
int p;
for(i = n; i > 1 && data[p = i / 2] > data[i]; i = p)
swap(data, p, i);
}

static void siftdown(int data[], int n) // adjust heap
{
int i;
int c;
i = 1;
while(1)
{
c = 2 * i;
if(c > n)
break;
if(c + 1 <= n && data[c + 1] < data[c])
c++;
if(data[i] <= data[c])
break;
swap(data, c, i);
i = c;
}
}

static void heapsort(int data[], int n)
{
int i;
for(i = 2; i <= n; i++)
{
siftup(data, i);
}
for(i = n; i >= 2; i--)
{
swap(data, 1, i);
siftdown(data, i - 1);
}
}

extern void heap(int a[], int n) //堆排序
{
int *p;
int i;
p = (int *)malloc((n + 1) * sizeof(int));
if(!p)
{
perror("malloc");
}
for(i = 0; i < n; i++)
*(p + i + 1) = a[i];
heapsort(p, n);
for(i = 0; i < n; i++)
a[i] = *(p + i + 1);
free(p);
}

基數排序根據你是N進制數,申請N個隊列,以空間換取時間,排序復雜度為線性o(n)

8. c語言中怎樣把n個數排列 得到所有排列情況

#include <stdio.h>
inline void Swap(char& a, char& b)
{// 交換a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//輸出一個排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多個排列方式
// 遞歸地產生這些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}

int main()
{
char s[]="123";
Perm(s, 0, 2);
return 0;
}

9. c語言 輸入n個數進行排序

printf("結果是:\n");
for(i=0;i<t;i++)
printf("%d\t",a[i]);

把這一部分寫到while循環外面

10. 用c語言編程:鍵盤上輸入N個整數,使該數組中的數按照從小到大的次序排列(選擇法排序)

#include "stdio.h"

#define N 10

int main(int argc,char *argv[]){

int a[N],i,j,k;

printf("Please enter %d integer(s)... ",N);

for(i=0;i<N;scanf("%d",a+i++));//輸入

for(i=0;i<N;i++){//選擇法排序

for(k=i,j=k+1;j<N;j++)

if(a[k]>a[j])

k=j;

if(k!=i)

j=a[k],a[k]=a[i],a[i]=j;

printf("%d ",a[i]);

}

printf(" ");

return 0;

}

代碼圖片和運行樣例: