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