1. 程式人生 > >各種排序演算法,一步步更新(一),桶排序,氣泡排序,選擇排序,快速排序

各種排序演算法,一步步更新(一),桶排序,氣泡排序,選擇排序,快速排序

部分方法來自我關注的博主  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完善  

由於演算法入門所以廢話和解釋較多

加油,哈哈哈,衝鴨!!!!!!