1. c語言中排序的方法有哪些
排序演算法和語言沒有什麼關系,一般來說面試,考試就是那些
快速排序
冒泡排序
堆排序
2. c語言三種排序
常用的c語言排序演算法主要有三種即冒泡法排序、選擇法排序、插入法排序。
一、冒泡排序冒泡排序:
是從第一個數開始,依次往後比較,在滿足判斷條件下進行交換。代碼實現(以降序排序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp;
for (int i = 0; i < 10; i++)
{//循環次數
for (int j = 0; j <10 - i-1; j++)
{
if (array[j] < array[j+1])
{//前面一個數比後面的數大時發生交換 temp = array[j];
array[j] = array[j+1];
array[j + 1] = temp;
}
}
} //列印數組 for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}
二、選擇排序以升序排序為例:
就是在指定下標的數組元素往後(指定下標的元素往往是從第一個元素開始,然後依次往後),找出除指定下標元素外的值與指定元素進行對比,滿足條件就進行交換。與冒泡排序的區別可以理解為冒泡排序是相鄰的兩個值對比,而選擇排序是遍歷數組,找出數組元素與指定的數組元素進行對比。(以升序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp, index;
for (int i = 0; i < 9; i++) {
index = i;
for (int j = i; j < 10; j++)
{
if (array[j] < array[index])
index = j;
}
if(i != index)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for(int i=0;i<10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j;
for(i = 1; i <size; i++)
for(j=i; j>0; j--)
{
if(arr[j] <arr[j-1])
{
temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
3. c語言編程排序問題
注釋加上了,看看行不行
#include
<iostream>
#include
<fstream>
#include
<algorithm>
#include
<time.h>
using
namespace
std;
int
ran(int
n)
//隨機函數,輸出是1~n的隨機整數
{
return
rand()%n+1;
}
/*c/c++語言中,生成隨機數要先生成種子,這點如果你不明白不要緊,日後一定會明白的
我大一的時候聽說之後也不明白*/
int
main()
{
int
num[200],i,n=200;
ofstream
Aout("a.dat"),Bout("b.dat");
//兩個文件流,就是對兩個文件進行寫操作的對象
//其中ofstream代表output,file,stream
srand((unsigned)time(NULL));
//生成隨機數的種子
cout<<"before
sort:"<<endl;
for(i=0;i<n;i++)
//這個for循環,生成n個隨機數(n=200,可以自己改n的值)
{
//cout是向控制台輸出,Aout是向a.dat輸出
num[i]
=
ran(1000);
cout<<num[i]<<"
";
Aout<<num[i]<<"
";
if((i+1)%10
==
0)
//這個的意思是每十個數一行,endl相當於換行
{
cout<<endl;
Aout<<endl;
}
}
cout<<endl;
sort(num,num+n);
//對這些數排序,快速排序方法,在algorithm頭文件中,O(nlogn)復雜度
cout<<"after
sort:"<<endl;
for(i=0;i<n;i++)
//輸出這些排序之後的數據,其中cout是向控制台輸出,Bout就是往b.dat輸出
{
//這個for循環是和上面的形式一樣的
cout<<num[i]<<"
";
Bout<<num[i]<<"
";
if((i+1)%10
==
0)
{
cout<<endl;
Bout<<endl;
}
}
cout<<endl;
return
0;
}
4. C語言 排序
#include <iostream>
using namespace std;
void sort(char* num,int size)
{
int total[10] = {0};
for(int i = 0; i < size; i++)
{
total[num[i]-'0']++;//對應的數字個數增加
}
int max = -1;
int maxId = 0;
cout<<endl;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
if(max < total[j])
{
max = total[j];
maxId = j;
}
}
for(int k = 0; k < max; k++)
{
cout<<maxId;
}
total[maxId] = -1;
max = -1;
}
cout<<endl;
}
void main()
{
char a[100];
cin>>a;
sort(a,15);
system("pause");
}
5. 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
6. c語言簡單排序
//希望我的回答對你的學習有幫助
//第一題
#include<stdio.h>
voidmain()
{
inti,j,t1,t2;
inta[10],b[10];
for(i=0,j=1;i<10;i++,j++)
{
scanf("%d",&a[i]);
b[i]=j;
}
for(intk=0;k<10;k++)
for(intl=k+1;l<=9;l++)
{
if(a[k]>a[l])
{
t1=a[l];a[l]=a[k];a[k]=t1;
t2=b[l];b[l]=b[k];b[k]=t2;
}
}
for(i=0;i<10;i++)
{
printf("%d",a[i]);
if(i<9)
printf("");
}
printf(" ");
for(i=0;i<10;i++)
{
printf("%d",b[i]);
if(i<9)printf("");
}
printf(" ");
}
7. C語言選擇法排序
#include<stdio.h>
#defineM 5
void main()
{
int b[M],i,j,t,k;
for(i=0;i<M;i++)
scanf("%d",&b[i]);
for(i=0;i<M-1;i++)
{
for(k=i,j=i+1;j<M;j++)
if(b[k]<b[j])
k=j;
if(i!=k)
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
}
for(i=0;i<M;i++)
printf("%d ",b[i]);
}
錯在大括弧位置加錯了。
代碼:
#include<stdio.h>
void SelectionSort(int *num,int n)
{
int i = 0;
int min = 0;
int j = 0;
int tmp = 0;
for(i = 0;i < n-1;i++)
{
min = i;//每次講min置成無序組起始位置元素下標
for(j = i;j < n;j++)//遍歷無序組,找到最小元素。
{
if(num[min]>num[j])
{
min = j;
}
}
if(min != i)//如果最小元素不是無序組起始位置元素,則與起始元素交換位置
{
tmp = num[min];
num[min] = num[i];
num[i] = tmp;
}
}
}
(此處空一行)
int main()
{
int num[6] = {5,4,3,2,9,1};
int i = 0;
SelectionSort(num,6);//這里需要將數列元素個數傳入。有心者可用sizeof在函數內求得元素個數。
for(i = 0;i < 6;i++)
{
printf("%d ",num[i]);
}
return 0;
}
8. C語言排序
關於你說的不確定數組問題,你可以這樣做:
int n, * p, i ;scanf("%d",&n); /* 輸入要對幾個數進行排序 */
p=(int *)malloc(sizeof(int)*n) ; /* 分配一個大小為 n 的整數動態數組 */
然後往 p 中存數即可。
9. 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),編程簡單,效率高,但是應付的數據范圍不能太大,受到內存大小的限制)。 平時比較常用的就是快速排序,程序簡單,效率也可以接受。 這是我了解的一些東西,希望對你有幫助。