排序思想:
將待排序的記錄ri;,插入到已排好序的記錄表r1,r2,····ri-1中,得到乙個新的、記錄數增加1的有序表。
直到所有的記錄都插入完為止。
設待排序的記錄順序存放在陣列r[1···n]中,在排
序的某一時刻,將記錄序列分成兩部分:
r[1···i-1]:已排好序的有序部分;
r[1···n]:未排好序的無序部分。
顯然,在剛開始排序時,r[1]是 已經排好序的。
void
straight_insert_sort
(sqlist *l)
l->r[j+1]
=l->r[0]
;//插入到相應位置
}}
當將待排序的記錄r[i]插入到已排好序的記錄子表r[1···i-1]中時,由於r1,r2,···ri-1已排好序,
則查詢插入位置可以用「折半查詢」實現,則直接插入
排序就變成為折半插入排序。
void
binary_insert_sort
(sqlist *l)
else
//查詢位置
for(j= i-
1; j>=high+
1;j--
) l->r[high+1]
= l->r[0]
//插入到相應位置}}
}
希爾排序(shell sort,又稱縮小增量法)是一種分組插入排序方法。1排序思想
①先取乙個正整數d1(d1int
main
(void
)shellsort
(a, len)
;// 呼叫希爾排序函式
printf
("希爾公升序排列後結果為:\n");
for(i =
0; i < len; i++
)printf
("\n");
return0;
}void
shellsort
(int
*a,int len)
a[k + gap]
= tmp;}}
}}
void
bubble_sort
(sqlist *l)}if
(flag == true)
}}
#include
void
swap
(int arr,
int low,
int high)
intpartition
(int arr,
int low,
int high)
swap
(arr, low, high)
;while
(low < high && arr[low]
<= base)
swap
(arr, low, high);}
return low>=base?low:low+1;
}void
quicksort
(int arr,
int low,
int high)
}int
main()
printf
("\n");
quicksort
(arr,
0, n-1)
;for
(j =
0; j < n; j ++
)return0;
}
/* 將sr[s..t]歸併排序為tr1[s..t] */
void
msort
(int sr,
int tr1,
int s,
int t)
}/* 將有序的sr[i..m]和sr[m+1..n]歸併為有序的tr[i..n] */
void
merge
(int sr,
int tr,
int i,
int m,
int n)
if(i
if(j<=n)
}/* 對順序表l作歸併排序 */
void
mergesort
(sqlist *l)
void
heapify
(int tree,
int n,
int i)
int c1=
2* i+1;
//左孩子
int c2=
2*i+2;
//右孩子
總結資料結構中重要的排序演算法
1 直接插入排序 適合資料較小且資料較有序的數字序列。演算法思想 將乙個陣列先劃分成已排序好的部分和未排序好的部分,從未排序好的部分中獲取乙個關鍵數作為待排序數,在 已 排好序的序列中找到合適位置插入這個資料。需要乙個中間變數tmp存放每次獲取的關鍵數。程式 如下 void insertsort i...
資料結構排序演算法總結
常用的演算法有插入排序 氣泡排序 選擇排序 快速排序 歸併排序 希爾排序 堆排序 計數排序和基數排序。下面對著九種常見排序方法進行總結 排序方法 時間複雜度 空間複雜度 個人評價 插入排序 o n 2 o 1 選擇排序 氣泡排序 希爾排序 o n log n 快速排序 o log n 歸併排序 o ...
資料結構 排序演算法總結
1 二路歸併排序 二路歸併排序 思路 利用分治思想,對原陣列進行二分分段,使元素在每一小段內有序,然後逐漸合併 如,最小分段是2,先2內有序,合併為4,4內有序。時間複雜度 o nlogn 空間複雜度 o n 需要乙個額外的陣列作為臨時儲存 static void mergesort int arr...