所有的排序演算法,預設: 小的在前 大的在後演算法複雜度:
比較相鄰兩個元素,若第乙個比第二個大 就交換順
每一對都交換順序,經過一輪比較之後,最後乙個元素就是最大
每一輪可以確定乙個最大的數.需要 陣列個數次
/*
氣泡排序原理:
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位置確定了.所以++}}
平均時間複雜度:o(n^2)void selectionsort(vector&arr)
}if (smallidx != i)
swap(arr[i], arr[smallidx]);}}
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.原理 找到陣列最小的那個數,和第乙...