直接排序是我常見的一種排序方法,是一種穩定的排序,時間複雜度平均為o(n),
我們平常生活中也經常無意的用到,比如說打牌的時候經常要排序。
首先想想我們打牌的時候是怎麼整理我們的牌的,一開始的時候有可能是完全無序的也有可能是一部分有序的,但是我們就把無序的牌直接插到有序的牌中,並且把比插入的牌大的牌往後移。
把問題抽象成程式中的話,意思為有著n個元素的陣列a[n],其中前面k項為有序的,後面的n-k項是無序的,我們要做的是把後面的n-k項插入到前面的k項中,形成乙個大的有序陣列。
舉個栗子:
int a[3]=;
這個陣列我們要把它排序,我們來模擬一邊這個直接插入排序的詳細過程。
外迴圈第一步,從第乙個開始,因為我們是用後面的跟前面的比較,因為a[0]=2,第零個的前面的沒有資料了。
當前的我們觀察的是a[1]=5,把5存起來,明顯比a[0]大,所以不做任何操作。
第二步,我們觀察的是a[2]=3,把3存起來,跟前面的a[1]=5比較,比a[2]=3大
內迴圈往前比較,現在比較的是a[1]=5,跟存好的3比較,比3大,往後移a[2]=a[1]
現在的陣列是;
繼續往前,a[0]=2,跟存好的3比較,比3小,找到插入的位置,把存好的3放入a[0]之後。
得出陣列為;
為什麼要兩個迴圈呢?因為遍歷的時候,除了往後移動當前的第乙個無序的,還要跟之前排好序的進行遍歷比較找到適合的插入的位置。
現在貼上**:
void mysort(int arr,int n)
arr[j+1]=temp; //插入到合適的位置 }
}
下面插入完整的**:
#include "stdafx.h"
#include #include #define numsize 20000
void mysort(int arr,int n)
arr[j+1]=temp; //插入到合適的位置 }
}int main(int argc, char* argv)
{ float nstart=clock();
srand((unsigned)time(null));
//產生2萬個隨機數
下面是20000個資料的排序情況
八大排序 直接插入排序
直接插入排序 straight insertion sort 的基本操作是將乙個元素插入到序列已經有序的那一部分中去,從而使序列中有序的部分逐漸擴大,直到整個序列有序。博主認為直接插入排序過程比較容易理解,所以不作過多贅述,直接上 include void main int length sizeo...
八大排序 插入排序 直接插入排序
基本思想 將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。直接插入排序示例 如果碰見乙個和插入元素相等的,那麼插入元素把想插入的...
八大排序之插入排序(直接插入排序 希爾排序)
插入排序 英語 insertion sort 是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序可以分為直接插入排序和希爾排序。直接插入排序 相信大家都玩過撲克牌 即使沒玩過,也聽說過 這就是插入,模擬到我們排序中,就...