排序演算法總結 待續

2021-09-02 22:14:33 字數 3444 閱讀 5980

所有的排序演算法,預設: 小的在前 大的在後

演算法複雜度:

比較相鄰兩個元素,若第乙個比第二個大 就交換順

每一對都交換順序,經過一輪比較之後,最後乙個元素就是最大

每一輪可以確定乙個最大的數.需要 陣列個數次

/*

氣泡排序原理:

1. 比較相鄰兩個元素,若第乙個比第二個大 就交換順序

2. 每一對都交換順序,經過一輪比較之後,最後乙個元素就是最大了.

3. 每一輪可以確定乙個最大的數.需要 陣列個數次

*/void bubblesort(vector&arr) }}

}

// 改進1: 用標誌來表明是否進行了資料的交換,若無資料交換,說明已經排好序了.

void bubblesort1(vector&arr)

}if (sorted)

break;

}}// 改進2:每次增加乙個反向冒泡,確定最小值

void bubblesort2(vector&arr)

}high--;// 排完序以後,high位置確定了.所以--

for (int j = high; j != low; j--)

}low++;// 排完序以後,low位置確定了.所以++}}

void selectionsort(vector&arr) 

}if (smallidx != i)

swap(arr[i], arr[smallidx]);}}

平均時間複雜度:o(n^2)

in-place sort,不穩定

從第乙個元素開始,該元素可以認為已經被排序

把第二個元素到最後乙個元素當成是未排序序列

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置。 (如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面

void insertsort(vector&arr) 

arr[j + 1] = key; //找到了對應位置賦值}}

// 鍊錶的插入排序程式
// array是排序的輸入,copy是輸出(有序)

void mergesortcore(vector&array, vector©, int start, int end)

int mid = (end + start) / 2;

mergesortcore(copy, array, start, mid); // 注意:copy和array的引數順序,經過排序後,array[start,end]是有序的!

mergesortcore(copy, array, mid + 1, end);

int i = mid;

int j = end;

int copyindex = end;

while (i >= start&&j >= mid + 1)

else

}while( i >= start)

while (j >= mid + 1)

return;

}// 從上到下歸併排序演算法!!!

void mergesort(vector&array)

從數列中選擇乙個作為基準. pivot

重新排序陣列, 實現: 所有大於 pivot都在它後面, 小於pivot都在它前面

劃分的這個步驟稱作 分割槽partition遞迴的將兩個分割槽進行排序.

int partition(vector&array, int start, int end) 

}swap(array[small], array[end]);

return small;

}void qucisortcore(vector&array, int start, int end)

}void qucisort(vector&array)

#include #include using namespace std;

void max_heapify(int arr, int start, int end) }}

void heap_sort(int arr, int len)

}int main() ;

int len = (int) sizeof(arr) / sizeof(*arr);

heap_sort(arr, len);

for (int i = 0; i < len; i++)

cout << arr[i] << ' ';

cout << endl;

return 0;

}

找出待排序的陣列中最大和最小的元素;

統計陣列中每個值為i的元素出現次數,存入陣列c的第i項

對所有的計數累加

反向填充目標陣列

void countingsort(vector&arr) 

}k += 1; // 為了讓陣列空間足夠大!

int _len = arr.size();

int *p = new int[_len]; // [0,_len-1]

int *q = new int[k + 1]; // [0,k]

// 初始化arr中元素出現次數都為0

for (int i = 0; i < k; i++)

// 統計arr陣列中元素的出現次數,儲存到q中.

// 值k的下標也為k

for (int i = 0; i < _len; i++)

// 將所有計數次數累加,即統計這個元素,以及它之前的元素共出現了幾次

// 確定了這個元素的最後位置+1

for (int i = 1; i < k; i++)

// 將元素重新輸入,次數最小為1,陣列開始為0.所以要減一

for (int i = 0; i < _len ; ++i)

// 將排序結果拷貝回去

for (int j = 0; j < _len; j++)

arr[j] = p[j];

// 釋放空間

delete q;

delete p;

}

排序學習總結(待續)

首先來說說排序的分類。1.插入排序 直接插入排序 折半插入排序 希爾排序 2.交換排序 氣泡排序 快速排序 3.選擇排序 直接選擇排序 堆排序 3.歸併排序 4.分配排序 桶排序 基數排序 5.外部排序。內部排序和外部排序的概念 在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內 外...

vimtutor總結(待續)

終端中輸入vimtutor即可進入教程。該教程介紹了一些必要的vim基本命令,掌握好這些命令基本上就能正常使用vim了。本篇文章是對vimtutor的整理和總結,並加入了一些補充內容。進入 vim 檔名 vimtutor重新進入vim教程 退出 正常模式下,輸入 q 即可退出 這種退出方式不會儲存所...

排序演算法 選擇排序和插入排序比較 待續未完

排序演算法非常重要,在計算機中,計算機中排序資料占用的工作量有20 左右,所以研究排序演算法有助於我們提高工作效率。排序演算法的效能由以下幾點決定 1.比較次數 2.交換次數 3.讀寫陣列次數 ps 對於不交換元素的演算法,我們會計算訪問陣列次數。一.選擇排序 1.原理 找到陣列最小的那個數,和第乙...