快排和插入排序
1.插入排序:資料來自:
? ? ? ? ? ? ? ? ? ??MoreWindows Blog()
?
直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經(jīng)排好序的子序列中的適當位置,直到全部記錄插入完成為止。設數(shù)組為a[0…n-1]。
1.????? 初始時,a[0]自成1個有序區(qū),無序區(qū)為a[1..n-1]。令i=1
2.????? 將a[i]并入當前的有序區(qū)a[0…i-1]中形成a[0…i]的有序區(qū)間。
3.????? i++并重復第二步直到i==n-1。排序完成。
?
學了數(shù)據(jù)結(jié)構(gòu)之后,我們可以用順序表來實現(xiàn),一般在實現(xiàn)的時候,如果0號標位不使用的話會跟好地表達:
//順序表結(jié)構(gòu)體定義 typedef struct {int * elem;//基址空間int length;//當前長度int size;//儲存容量int increment;//擴容的增量 }SqList;//直接插入算法描述: int InsertSort(SqList & L) {if (L.elem == NULL) {return ERROR;}int i,j;//可以這么想,就i到哪哪里之前就已經(jīng)是有序項了,那i指到1,2,3,4倒數(shù)第二個3的時候,//1,2,3,這三個都是有序的了,而這時要處理的是4,處理完后,i就指到4,也排好了,所以是i<lengthfor (i = 1; i < L.length; i++) {if (L.elem[i + 1] < L.elem[i]) {//說明要插到前面去,如果比他大就不用插L.elem[0] = L.elem[i + 1];//先放到0那存一下L.elem[i + 1] = L.elem[i];j = i ;//j初始的位置是有序列的最后一個元素while (j - 1 != 0 && L.elem[0] < L.elem[j - 1]) {//j所指的是確定已經(jīng)比i+1大的了L.elem[j] = L.elem[j - 1];j--;}L.elem[j] = L.elem[0];}}return OK; }?
?
2.快排:
快速排序簡單的說就是選擇一個基準,將比起大的數(shù)放在一邊,小的數(shù)放到另一邊。對這個數(shù)的兩邊再遞歸上述方法。
66 ?13 ?51 ?76 ?81 ?26 ?57 ?69 ?23,以66為基準,升序排序的話,比66小的放左邊,比66大的放右邊
從右邊找到23比66小,互換(一定要右邊先)
23 ?13 ?51 ?76 ?81 ?26 ?57 ?69 ?66
從左邊找到76比66大,互換
23 ?13 ?51 ?66 ?81 ?26 ?57 ?69 ?76
繼續(xù)從右邊找到57比66小,互換
23 ?13 ?51 ?57 ?81 ?26 ?66 ?69 ?76
……
……
23 ?13 ?51 ?57 ?26 ?66 ?81 ?69 ?76最后所有比66小的數(shù)都在66左邊,比66大的數(shù)在66右邊
接下來再分別對66左邊和右邊的數(shù)再次排序,即遞歸
代碼:
void sort(int *a,int left,int right)//a是數(shù)組,left,right分別是左右指引
{
if(left>=right)return;//如果左邊指引大于右邊指引說明完成了
int i=left,j=right,key=a[left];
while(i<j)//控制第一輪,結(jié)束后所有比key小的在key左邊,比key大的在key右邊
{
while(i<j&&a[j]>=key)//從右邊開始,找比key小的數(shù)
j--;
a[i]=a[j];//找到后賦值給左邊那個數(shù)
while(i<j&&a[i]>=key)//從右邊找,找比key大的數(shù)
i++;
a[j]=a[i];
}
a[i]=key;//a[i]這個位置已經(jīng)變了,所以要key回歸
sort(a,left,i-1);
sort(a,i+1,right);//遞歸
}
轉(zhuǎn)載于:https://www.cnblogs.com/wangshen31/p/6528486.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結(jié)
- 上一篇: 域名介绍
- 下一篇: 按照要求输出相应的二维数组