1、選擇排序
基本思想:首先,選出最小的數放在第一位,然後選擇第二小的數,放在第二位;以此類推,直到所有的數從小到大排列.
那麼,對於大小為n的陣列需要n-1輪選擇過程。第i輪選取第i小的數,請將其放在第i個位置上。
不穩定
平均時間複雜度o(n^2)
最好情況o(n^2)
最壞情況o(n^2)
空間複雜度o(1)
*/
void select_sort(int a, int n)
if(i != min_index)
} }
/* 2、氣泡排序
基本思想: 不斷比較相鄰的兩個數,讓較大的數不斷地往後移。經過一番比較,就選出了最大的數。經過第二輪比較,就選出了次大的數。以此類推。
那麼對於大小為n的陣列,需要n-1輪比較。
平均時間複雜度o(n^2)
最好情況o(n)
最壞情況o(n^2)
空間複雜度o(1)
*/
void bubble_sort(int a,int n)
} if(is_sorted)//如果沒有發生交換,說明已經排好序了,提前退出迴圈,所以最好情況下時間複雜度為o(n)
break;
} }
/* 3、快速排序
基本思想:採用分而治之的思想,將要排序的數分成左右兩部分,其中一部分的資料比key小,另一部分資料比key大。然後將所分得的兩部分資料進行同樣的劃分。重複執行以上的劃分操作。
平均時間複雜度o(nlog2(n))
最好情況o(nlog2(n))
最壞情況o(n^2)
空間複雜度o(nlog2(n))
*/
int partition(int arr, int low, int high)//返回劃分的中間值
if(low < high)
arr[low ++] = arr[high];//找到合適的資料填到了low坑,但是形成了high坑,繼續找合適的資料
while( low < high && arr[low] <= key)
low ++;
if( low < high)
arr[high --] = arr[low];//low又成了坑
} arr[low] = key;//將key填到這個坑
return low;
} void quick_sort(int num, int low, int high)
} 4、插入排序
基本思想:將元素逐個新增到已經排好序的陣列中去。
平均時間複雜度o(n^2)
最好時間複雜度o(n)
最壞時間複雜度o(n^2)
空間複雜度o(1)
*/
void insert_sort(int a, int n)
//如果找到合適位置i應該!=j,如果i==j,說明i正好在正確的位置
if( i != j)
} }
/* 5、希爾排序
基本思想:將無序陣列分成若干個子串行,子串行不是逐段分割的,而是相隔特定增量。對各個子串行進行插入排序。
然後再選擇乙個更小的增量,再將陣列分割成多個子串行進行排序。最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序陣列。
平均時間複雜度o(n^1.3)
最好時間複雜度o(n)
最壞時間複雜度o(n^2)
空間複雜度o(1)
*/
void shell_sort(int a, int n)
} } }
/* 6、歸併排序:
基本思想:將待排序序列【0,n-1】看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表。再次歸併,得到n/4個長度為4的有序表。
依次類推,最後得到長度為n的1個有序表。
所以歸併排序其實要做兩件事:
1、先遞迴的分解數列,
2、再合併數列就完成了歸併排序。
先來考慮如何合併?
每次合併過程中都要對兩個有序的序列段進行合併,然後排序
待合併的兩個有序序列段分別為 r[low, mid] 和 r[mid+1, high]
先將它們合併到乙個暫存陣列r2,合併完再將r2複製回r1中。
這樣一次合併排序就完成了。
最好、最壞和平均時間複雜度都是o(nlogn),
空間複雜度是o(n)
*/
void merge(int a, int low ,int mid, int high,int tmp)
while( i <= mid)
tmp[k++] = a[i++];
while( j <= high)
tmp[k++] = a[i++];
//最後再複製回a
for(i = 0; i < k; i++ )
a[low+i] = tmp[i];//!!!!此處a是從low開始,tmp是從0開始。
} void merge_sort(int a,int low, int high, int tmp)
} bool sort(int a, int n)
/* 堆排序
*/
int main()
; //select_sort(num, 7);
//bubble_sort(num,7);
//quick_sort(num,0,6);
quicksort2(num, 0, 6);
//insert_sort(num,7);
//shell_sort(num,7);
//sort(num,7);
for(int i = 0; i < 7; i++)
return 0;
}
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...