各種經典排序演算法彙總( 親測除錯運算通過)

2021-06-05 01:01:28 字數 3502 閱讀 9125

這幾天好好學習了一下排序演算法 檢視了各種書籍和網路資源 挑著簡單易懂的教程好好學習了一下  基本上算是過了一遍 之後幾天 對排序演算法好好地總結一下 整理一下,先把要整理的演算法列舉一下:

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,...