各種排序演算法,一步步更新(一),桶排序,氣泡排序,選擇排序,快速排序
阿新 • • 發佈:2018-11-09
部分方法來自我關注的博主 J_小浩子 謝謝
1 桶排序 bucketsort
1 桶排序 #include <stdio.h>//桶排序基本說明 int main(){ int data1[11]={0},temp,i,j; // num=11 所以桶排序只能用來輸入和儲存0-10 之間的數 字//data1【11】={0}讓陣列元素的初始數值 初始化為0 for(i=0;i<11;i++){ scanf("%d",&temp); // 以temp作為輸入介質 輸入的0-10之間的數字 輸入給temp對應的陣列data1【temp】會加1 data1[temp]++; //陣列像是一個木桶一樣 儲存輸入的0-10 之間數字的數量 } for(i=0;i<11;i++){ // i作為引導 從0走到10 for(j=0;j<data1[i];j++){ //j用來檢測 data1【i】的值,大於0則可以輸出,按照data1【i】的值即木桶的數量輸出次數 printf("%d ",i); } } return 0; } //方法來自 啊哈演算法 時間複雜度O(n=11) ,O(n)
2 氣泡排序 bublesort
#include <stdio.h> void bublesort(int data[],int n);//氣泡排序基本說明是 void的部分 // //此題為啊哈演算法 小哼買書的氣泡排序解法 int main(){ int n,i,j,temp; scanf("%d",&n); int data1[n]; for(i=0;i<n;i++){ scanf("%d",&data1[i]); } bublesort(data1,n); printf("%d",data1[0]); for(i=1;i<n;i++){ if(data1[i]!=data1[i-1]){ printf(" %d",data1[i]); } } return 0; } void bublesort(int data[],int n){ // 基本氣泡排序說明 需要陣列和陣列元素數 N int i,j,temp; //i,和 J用來檢查陣列 按照從小往大方向排序,temp用來做替換介質 for(i=0;i<n-1;i++){ //共N個元素 所以最多比較n-1次,如兩個元素 最多比較一次 for(j=0;j<n-i-1;j++){ //J從 開始項找 最多尋找n-i-1次 (最多n-1次比較,i每+1,就排好一個本趟中最大的元素,就只剩下n-i-1個需要比較的了, //且初始是i為0 第一次可以減0,第一次以後 最大的元素在最後面,需要比較的元素個數為 (n-1)-1 //所以最多進行n-i-1次往後查詢) if(data[j]>data[j+1]){ //因為按照從小往大排序 發現前一項大於後一項 就交換他們兩個 temp=data[j+1]; data[j+1]=data[j]; data[j]=temp; } } } return; }
3 選擇排序 selectsort
#include <stdio.h> void selectsort(int data[],int n);//基本選擇排序 利用陣列和陣列元素數 int main(){ int i,n; scanf("%d",&n); int data1[n]; for(i=0;i<n;i++){ scanf("%d",&data1[i]); } selectsort(data1,n); for(i=0;i<n;i++){ printf("%d ",data1[i]); } system("pause");//用於暫停 return 0; } void selectsort(int data[],int n){ int i,j,mini,temp; for(i=0;i<n-1;i++){ //一共n項元素,所以最多需要排序 n-1次 mini=i; // 假設每一次 最小項的下標mini是 i,按照從小往大排序 for(j=i+1;j<n;j++){ if(data[j]<data[mini]){ // j=i+1 因為假設第i項是最小的 所以從i想後的 每一項尋找有沒有比i更小的元素 mini=j; //那麼檢測 i項後面 有沒有比data【mini=i】更小的項,如果有 就把mini下標標記成更小的 } } if(i!=mini){ //如果 i!=mini說明 i不是最小項,mini被替換過,所標記項才是最小項 temp=data[i]; //把最小項放到前面,較大項放到後面,這樣把他們交換過來,按照從小往大排序 data[i]=data[mini]; data[mini]=temp; } } return; }
4 快速排序 quicksort
#include <stdio.h>
int data1[100],n;
void quicksort(int left,int right);//快速排序
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&data1[i]);//讀入陣列 共n項,從1到N項
}
quicksort(1,n);//對陣列 1到N 進行快速排序,輸出演示,暫停
for(i=1;i<=n;i++){
printf("%d ",data1[i]);
}
system("pause");
return 0;
}
void quicksort(int left,int right){
int i,j,t,temp;
//I , J,反別負責從左到右,從右往左遍歷查詢
if(left>right){
//如果所給位置錯誤 右邊序號小於左邊,返回錯誤,結束
return;
}
temp=data1[left];
//temp儲存首項——基準數,i為左,J為右,遍歷
i=left;
j=right;
while(i!=j){
//兩者未相遇,想讓J從右邊找到一個小於基準數的數字
while(data1[j]>=temp && i<j){ //必須讓右邊先找一個小於基準數字的數
j--;
}
while(data1[i]<=temp && i<j){
//再讓I從左邊找到一個大於基準數的數字
i++;
}
if(i<j){
//因為這兩者I J沒有相遇,所以將他們兩個交換 T取後面數值,後面數字=前面數字,前面數字=T
t=data1[j];
// 基準數字為6*****73**** 假設i位置為 7 J位置為 3 所以交換,下一次相遇3 和基準數6交
data1[j]=data1[i];
// 6********87****正常 6**********i 58 j *********5 6交換
data1[i]=t;
}
}
data1[left]=data1[i];
//當i,和J相遇之後說明除了 首項基準數 之外就只有 相遇除的數字不合理,,
data1[i]=temp;
//所以將 基準數 相遇處數字交換
quicksort(left,i-1);//同理 遞迴操作處理基準數字左邊 基準數字右邊
quicksort(i+1,right);
return;
}
2018-10.16 第一篇部落格 10.17完善
由於演算法入門所以廢話和解釋較多
加油,哈哈哈,衝鴨!!!!!!