這幾天好好學習了一下排序演算法 檢視了各種書籍和網路資源 挑著簡單易懂的教程好好學習了一下 基本上算是過了一遍 之後幾天 對排序演算法好好地總結一下 整理一下,先把要整理的演算法列舉一下:
1,選擇排序
對於乙個a[0,n]的陣列,依次遍歷陣列,每次選出最大或最小的乙個數
void selectsort(int *a,int size)
print(a,size);
}
2,氣泡排序
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。
void bubblesort(int *a,int size)
print(a,size);
}
優化:使用標誌的氣泡排序, 因為當一次遍歷時 沒有發生任何的交換 事實上證明陣列排序已經完成 函式可以退出
void bubblesortwithflag(int *a,int size)
} if(flag==true)
}}
雞尾酒排序 :氣泡排序的變形 **)
雞尾酒排序等於氣泡排序的輕微變形,不同的地方在於從低到高然後從高到低,而氣泡排序則僅從低到高去比較序列裡的每個元素。他可以得到比氣泡排序稍微好一點的效能,原因是氣泡排序只從乙個方向進行比對(由低到高),每次迴圈只移動乙個專案。以序列(2,3,4,5,1)為例,雞尾酒排序只需要訪問兩次(公升序降序各一次 )次序列就可以完成排序,但如果使用氣泡排序則需要四次。
(1)先對陣列從左到右進行氣泡排序(公升序),則最大的元
素去到最右端;
(2)再對陣列從右到左進行氣泡排序(降序),則最小的元素去到最左
端。以此類推,依次改變冒泡的方向,並不斷縮小未排序元素的範圍。
void cocksort(int *a,int size)
up=index;
for(int i=up;i>low;i--)
if(a[i]
3,插入排序 (直接,折半,路插入,表插入
)依次取出便利每一項 將每一項temp=a[j]和其之前的數進行比較,如果發現了比自己大的數 就將其放在當前j的位置 同時j--,繼續用temp和之前的數進行比較,直到沒有比自己大的數時結束。
//直接插入排序
void insertsort(int *a,int size)
for( j=i;j>high+1;--j) //所以 這裡的high要加一哇
a[j]=a[j-1];
a[j]=temp;
} print(a,size);
}
路插入 和 表插入 過幾天再說.......
4,希爾排序
希爾演算法思想:將整個無序序列分割成若干小的子串行分別進行插入排序。
如 乙個長度為13的陣列
81 9411 96123517 952858417515
先以13/2=5為gap進行比較 即對(81 35 41)(94 17 75)(11 95 15)分別進行排序 即對陣列進行一次間距為5的插入排序
之後以3 和 1為間距 對陣列進行插入排序
void shellsort(int *a,int size) // **取自 資料結構於問題求解(c++版)
; //從前往前 找小於支點的
if(i7,堆排序
取自演算法導論
int left(int i) // 這裡取左右和父節點 是以 頂節點index為0來考慮的
int right(int i)
int parent(int i)
void max_heapify(int *a,int heapsize,int i)
// 是對最大堆進行操作的重要子程式 用於保持堆的性質
}void build_max_heap(int *a,int size) //構建最大堆 (堆的大小 小於等於 陣列的大小 )
}void heapsort(int* a,int size)
}
8,計數排序
void countingsort(int *a,int size,int k)
for(int j=0;j=0;t--)
//int pos=0; // 上面是演算法導論的標準方法 下面的方式我覺得直觀而且快一些
//for(int i=0;i<=k;i++)
//;void bucketsort(int a,int size,int bucketsize)
for(int j=0;jkey=a[j];
node->next=null;
int index=a[j]/10;
node *buketnode=buckettable[index]; // 找到自己應當所在的桶
if(buketnode->key==0)
else
int pos=0;
for(int t=0;tnext;p!=null;p=p->next)
}}}
10,基數排序
11,位圖排序
今後幾天 會詳細總結。。。。。
各種排序演算法彙總
各種排序演算法彙總 include include include include using namespace std template void insertsort t a,int n 直接插入排序,時間複雜度為o n 2 a j d temp 這個while實際上是直接插入排序 d 1 即...
演算法 c 實現各種經典內部排序
經典的排序演算法如下 交換排序 選擇排序 歸併排序 基數排序 桶排序 實現 main.cpp sort created by peiyu wang on 2019 3 28.include include include include using namespace std const vecto...
經典排序演算法的彙總之歸併排序
經典排序演算法的彙總之歸併排序 歸併排序 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序 void mymerge int a int b int na,int nb int ic 0,...