1.首先,排序按類來分有插入排序、選擇排序、交換排序和歸併排序,而插入排序又分為直接插入排序和希爾(shell)排序;選擇排序類又分為選擇排序和堆排序,交換排序分為氣泡排序和快速排序,今天主要分享插入排序和希爾排序。
2.插入排序概念
插入排序:對乙個陣列中的數,比較大小,假設它是公升序排列,認為它的第乙個數是有序的,拿它的第二個數來和第乙個數相比,若比第乙個數大,位置不變(它不動),反之把它和第乙個交換,所以現在看來前兩個數就是有序的了,再往後走,與前面的數比較,按相同的方法。。。。o(∩_∩)o哈哈~,
文字很繁瑣,上個圖:
注意迴圈條件很重要,超級重要,特別重要,乙個開閉區間、乙個等於的有否可能會導致** over~such pain huh?
1.有序數個數變化 開始1,迴圈一次 2
2.比較 與誰比較? 與前面排出來的有序數從前後往前依次比較。
直接插入排序**如下:
或者不儲存前乙個的值,直接交換它們兩個:#include
#include
using
namespace
std;
//直接插入排序
void insertsort(int* arr,int n)//arr陣列名,n陣列大小
else
}arr[end + 1] = tmp;//前面的位置應該放的值 }}
測試用例:void insertsort(int arr,int len)
else}}
}
3.shell排序(公升序):void myprint(int* arr,int n)
cout
<< endl;
}void test1()
; myprint(a, sizeof(a) / sizeof(int));
insertsort(a, sizeof(a) / sizeof(int));
myprint(a, sizeof(a) / sizeof(int));
}
shell排序又稱為縮小增量排序,排序基本思想:陣列有n個元素,設定乙個間隔gap(gap < n),將所有元素分為gap個子序列,所有距離為gap的元素放在乙個自序列中,對每個子串行進行直接插入排序,縮小gap值,直到取到gap為1再做一次排序。
gap對資料進行分組–>每組內部進行比較–>縮小gap值–>再進行分組比較
shell排序分為2步:預排序和直接插入排序。
預排序就是使陣列中的數盡量有序,小的數盡量在前面,大的數盡量在後面;
gap就是為了提公升效率,gap > 1時,都是預排序;
gap==1時,是最後一次排序。
gap = gap / 3 + 1;//每次更新gap值}}
}與上面**差不多,只不過不儲存前乙個的值,如果後乙個數小於前乙個數,交換它們兩個,否則break退出即可。
總結:void shellsort(int arr, int len)
else
}gap = gap / 3 + 1;}}
}
直接插入排序時間複雜度o(n^2),是一種較為穩定的排序演算法,但是當資料無序程度較大時或者逆序,它的效率就會非常低。
shell排序很好的解決了這種問題,利用gap分組,使資料變得接近有序,從而提高排序的效率,但是當資料本身就接近有序或陣列中的數就是有序數時,它的預排序就沒有起到作用;如果資料很多,陣列非常大,則gap值也會很大,此時意味著整體越不接近於有序。
shell排序的時間複雜度大概在o(n)~o(n^2)。shell排序是一種不太穩定的排序演算法。
插入排序和希爾排序
插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,插入排序的基本思想是 每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。public static void sortins...
插入排序和希爾排序
author shenqi date 2018 1 15.插入排序 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 ...
插入排序和希爾排序
思想 插入排序的思想是將乙個無需的數列中的資料挨個插入到乙個已經有序的數列中,使得插入後原本有序的數列依然有序,最終完成整個數列的排序。在實際的排序過程中,已經有序的數列 指的是數列中被拍好序的部分。考慮對下圖的陣列進行插入排序 首先考慮6這個元素,因為第乙個元素8只有它自己,是已經排好序的。考慮6...