排序演算法c語言描述---直接插入排序
阿新 • • 發佈:2018-11-12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
排序算法系列學習,主要描述氣泡排序,選擇排序,直接插入排序,希爾排序,堆排序,歸併排序,快速排序等排序進行分析。
文章規劃:
一。通過自己對排序演算法本身的理解,對每個方法寫個小測試程式。 具體思路分析不展開描述。
二。通過《大話資料結構》一書的截圖,詳細分析該演算法 。
在此,推薦下程傑老師的《大話資料結構》一書,當然不是打廣告,只是以一名讀者的身份來客觀的看待這本書,確實是通俗易懂,值得一看。
ps:一個較為詳細的學習連結 http://blog.csdn.net/MoreWindows/article/category/859207
三。直接插入排序
一。個人理解
直接插入排序的操作是將一個紀錄插入到已經排序好的有序表中的適當位置,直到全部紀錄插入為止。 (直接插入的原理:把一個標記插入到已經排好序的有序表中。如: 把arr[i]插入arr[0]---arr[i-1]中的某個位置,其中,arr[0]---arr[i-1]是排好序的。這時候從後往前,在arr[i-1]到arr[0]中找到第一次滿足比arr[i]小的那個數,則把arr[i]插入這數字後面,相應的把後面的大於arr[i]的元素都往後移,則此時arr[0]----arr[i]就是有序的,如此反覆,直到全部元素都找好自己的位置)程式碼如下:
#include<stdio.h>// 列印結果void Show(int arr[], int n){ int i; for ( i=0; i<n; i++ ) printf("%d ", arr[i]); printf("\n");}//直接插入排序 按從小到大排序void Insertsort (int arr[], int n){ int i, j, k; int temp; for (i = 1; i < n; i++) { //為a[i]在前面的a[0...i-1]有序區間中找一個合適的位置,插入a[i] for (j = i - 1; j >= 0; j--) if (arr[j] < arr[i]) //尋找合適位置 break; //如找到了一個合適的位置 if (j != i - 1) { //將比a[i]大的資料向後移 temp = arr[i]; for (k = i - 1; k > j; k--) arr[k + 1] = arr[k]; //將a[i]放到正確位置上 arr[k + 1] = temp; } }}int main(){ //測試資料 int arr_test[10] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 }; //排序前陣列序列 Show( arr_test, 10 ); Insertsort( arr_test, 10 ); //排序後陣列序列 Show( arr_test, 10 ); return 0;}
這個直接插入演算法比較常規,照著演算法本身的思路一步步來的,後來看了其他人的部落格以及書中的寫法,發現其實是可以進一步優化的。 可以把搜尋arri]合適的位置和比arr[i]大的資料後移這兩個步驟合併。也就是說,每次arr[i]與其前面一個數據arr[i-1]比較的時候,如果arr[i] > arr[i-1],則說明a[0]----a[i]之間都是有序的,無需調整。否則就令j=i-1,temp=arr[i]。然後一邊將資料arr[j]往後移動一邊向前繼續搜尋,直到有資料arr[j]<arr[i]時候停止,然後將temp(arr[i])放在arr[j+1]處。
下面是優化後的程式碼。其實本質思想還是沒變的。
#include<stdio.h>// 列印結果void Show(int arr[], int n){ int i; for ( i=0; i<n; i++ ) printf("%d ", arr[i]); printf("\n");}//直接插入排序 按從小到大排序void Insertsort2(int arr[], int n){ int i, j; int temp; for (i = 1; i < n; i++) if (arr[i] < arr[i-1]) { temp = arr[i]; for (j = i - 1; j >= 0 && arr[j] > temp; j--) arr[j + 1] = arr[j]; arr[j + 1] = temp; }}int main(){ //測試資料 int arr_test[10] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 }; //排序前陣列序列 Show( arr_test, 10 ); Insertsort2( arr_test, 10 ); //排序後陣列序列 Show( arr_test, 10 ); return 0;}
二。 《大話資料結構》一書截圖分析
注:本文僅為分享知識,絕無商業用途。
如果以該種形式分享知識造成不必要的糾紛,還請第一時間告知。