時間複雜度、空間複雜度盡量要小,穩定性要高(即相同的數字如4521373,經過排序後原來在後面的3還是在那個3的後面)
思想:直插就是把乙個數字插入到一組有序的陣列中去,那麼對於一組無序的陣列,我們怎麼樣來用這個演算法實現呢
一樣的,由於第乙個數字必定是有序的,我們將第二個數字開始放到臨時量tmp中去,然後與這個數字前面的數依次進行比較(此時前面的數字已經是有序的了),放到第乙個比他大的數字的位置去就可以了,這樣一次對後面的數字進行這種操作最後這個陣列就是有序的了,如下圖所示:
第一趟:i從下標1開始,與他前面的數4進行比較,由於大於4直接插到4後面就好
第二趟:從下標2開始,此時他前面的數字4、5都是有序的,只要將7放到tmp中去,與他前面的數進行比較,比較到他前乙個數即可(由於前面的數必定有序,後面的數就不一定了),然後插入合適位置就好
第三趟:i=3,j=2;與前面兩趟的比較過程一樣,此時3插到第乙個位置,後面的數往後面挪,i在、一直++到最後乙個數即可,其過程和前面一樣
(1)先從tmp前面查詢有沒有比他大的有再插入
解法一的世界複雜度較大,o(n^3),最少也有o(n^2)
void s_insertsort1(int *arr,int len)
arr[j] = tmp;
break;
}if(j==i)}}
} (2)改進演算法
改進的思想在於將後面兩個for迴圈合併為乙個,j從i-1處開始往前遍歷,只要》tmp就和他交換
void insertsort(int *arr,int len)}}
} 改進的演算法時間複雜度為o(n^2),最好的情況下可以達到o(n)
思想:每次把最大的數字放到最後面,j每次從下標0開始往後走,由於每次都把最大的數字放到最後乙個,所以j只用走到待排序數的前乙個就好。如下圖所示,7,8是已經排好了的,這個時候j只用走到下標3即可,因為7,8已經是排好的兩個最大的了,沒必要再往後走
} 思想:每次選擇最小的數和帶排序序列中的第乙個數交換
注意:由於每次都要遍歷序列找到那個最小的數然後和待排序序列的第乙個數交換,一定要儲存那個最小的數的下標再次才能找到
void selectsort(int *arr,int len)
}tmp = arr[i];//待排序序列的第乙個數儲存其中最小的數
arr[i] = arr[minindex];
arr[minindex] = tmp;}}
思想:定義乙個low、定義乙個high將low指向的資料作為基準,從high指向的位置往前查詢,有比他小的插入到low處,從low處往後查詢,有比他大的放到high處
int partition(int *arr,int low,int high)//一次排序
if(low == high)
else
while((low
if(low == high)
else
}arr[low] = tmp;
return low;
}void quick(int *arr,int low,int high)//乙個待排序列用遞迴的方法使用快速排序
if(par+1 < high)
}void quicksort(int *arr,int len)//馬甲函式,實現物件導向,方便使用者呼叫這個函式直接可以使用
思想:建成大根堆,從下往上建堆,從上往下調整.每次講待排序序列的最後乙個數字和0下標值進行交換
在這裡用到兩個公式
1、由父節點n推左右孩子節點為2*n+1、2*n+2
2、由孩子節點n推父節點(n-1)/2
void heapadjust(int *arr,int start,int end)//一次建堆
if(arr[i] > tmp)
else
}arr[atsrt] = tmp;
}void heapsort(int *arr,int len)
for(i=0;i}
思想:每兩個數一組,兩個中小的放到前面,兩兩有序
幾種基本排序演算法的總結歸納
概述 排序有內部排序和外部排序 我們討論的八大排序是內部排序 當n較大時,則應採用時間複雜度為o nlog2n 的排序演算法 快速排序 堆排序或歸併排序。快速排序shimuqian基於比較的內部排序中被認為最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短 各種排序的穩定性,時間複雜度...
幾種常用的排序演算法
介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...
幾種常用的排序演算法
介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...