排序演算法原理以及實現
阿新 • • 發佈:2019-01-03
1.氣泡排序演算法
2.插入排序演算法
/* * 1.第一個元素開始,假設第一個元素已排序 * 2.取下一個元素temp_val,在已排序的區間從後往前掃描,如果大於temp_val,則往後移 * 3.直到小於的時候,將其後一位置為temp_val即可 * 4.重複n-1次2、3步驟 */ //三個引數目的是為了,排序某個區間 void insertion_sort(vector<int> array, int first,int last) { int j; int temp_val; //取出來的未排序排序數 for(int i = first+1; i<=last; i++) //未排序數遍歷 { temp_val = array[i]; j = i-1; //已排序數的最後一個 while(j>=0 && array[j]>temp_val) //已排序未越界且未排序數大於temp_val { array[j+1] = array[i]; //後移 j--; //往前掃描 } array[j+1] = temp_val; //到已排序小於temp_val,則下一位為tem_val的位置 } }
二分插入排序
/* * 1.第一個元素開始,假設第一個元素已排序 * 2.取下一個元素temp_val,在已排序的區間二分查詢,如果mid的值大於等於temp_val,則right=mid,反之left = mid * 3.直到right<left的時候,確定mid位置,插入mid,之後後移並插入 */ //三個引數目的是為了,排序某個區間 void insertion_sort(vector<int> array, int first,int last) { int left,mid,right; int temp_val; //取出來的未排序排序數 for(int i = first+1; i<=last; i++) //未排序數遍歷 { temp_val = array[i]; left = 0; //已排序數的二分左端 right = 0; //已排序數的二分右端 //二分查詢精髓,確定要插入位置,最後位置在left(mid)上 while(left<=right) //已排序未越界且未排序數大於temp_val { mid = (left + right)/2; if(array[mid]>=temp_val) right = mid-1; else left = mid+1; } //後移,為temp_val騰出空間 for(int j = i-1; j>left; j--) array[j+1] = array[j]; array[left] = temp_val; //到已排序小於temp_val,則下一位為tem_val的位置 } }
3.希爾排序
4.選擇排序
5.氣泡排序
6.雞尾酒排序/雙向冒泡
7.快速排序
void quick_sort(vector<int> array, int left, int right) { int i,j,temp_val; if(left > right) return ; temp_val = array[0]; //選取基準 i = left; //左向右掃描 j = right; //右向左掃描 while(i!=j) { //最開始從右向左掃描,必須先從右開始 while((array[j] >= temp_val) && i <j) //找到第一個大於temp_val的值 j--; while((array[i] <= temp_val) && i<j) //找到第一個小於temp_val的值 i++; if(i<j) //交換位置 { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } array[left] = a[i]; //將最中間的數值與基準交換位置 array[i] = temp; quick_sort(array, left, i-1); //對標準值左半部遞迴呼叫本函式 quick_sort(array, i+1, right); //對標準值右半部遞迴呼叫本函式 } }