通過乙個簡單的選單,分別實現下列排序要求,採用幾組不同資料測試各排序演算法的效能(比較次數和移動次數)及穩定性。
實現簡單選擇排序、直接插入排序和氣泡排序;
實現折半插入排序;
實現希爾排序演算法;
實現快速排序演算法(遞迴和非遞迴);
實現堆排序演算法。
(1)輸入:
根據選單提示選擇排序演算法,輸入一組待排序資料。
(2)輸出:
輸出排序結果(體現排序過程),及排序過程中資料的比較次數和移動
測試資料
直接插入排序
50 23 6 71 90 33 99 45
折半插入排序
33 99 45 4 99 2 50 13
希爾排序
6 71 50 66 12 9 67 43
簡單選擇排序
3 99 45 23 60 47 91 7
氣泡排序
6 71 51 88 19 45 37 51
快速排序
50 23 6 55 60 57 91 66
堆排序5 33 73 91 20 87 93 91
主要資料型別與變數
typedef int keytype;
typedef structredtype;
//順序表型別
typedef structsqlist;
部分函式模組
void insersort(sqlist &l)
l.r[j+1] = l.r[0];
printlist_sq(l);
} m++;
} printf("比較次數為:%d\n", m);
printf("移動次數為:%d\n", n);
} void binsertsort(sqlist &l)
for(j=i-1; j>=high+1; --j)
l.r[high+1] = l.r[0];
b++;
printlist_sq(l);
} a++;
printf("比較次數為:%d\n", a);
printf("移動次數為:%d\n", b);
}void shellinsert(sqlist &l, int dk, sqlist &h)
l.r[j+dk] = l.r[0];
n++;
m++;
} printlist_sq(l);
h.length += m;
h.r[0].key += n;
}void shellsort(sqlist &l)
printf("比較次數為:%d\n", h.length);
printf("移動次數為:%d\n", h.r[0].key);
}status selectminkey(sqlist l, int i)
m++;
} printlist_sq(l);
printf("比較次數為:%d\n", m);
printf("移動次數為:%d\n", n);
}
}void qsort(sqlist &l, int low, int high, sqlist &h)
}status partition(sqlist &l, int low, int high, sqlist &h)
l.r[low] = l.r[high]; n++;
while(low0; --i)
heapadjust(h, i, h.length, l);
for(i = h.length; i>1; --i)
printf("比較次數為:%d\n", h.length);
printf("移動次數為:%d\n", h.r[0].key);
}
若干常用(內部)排序演算法的總結
實現 中會出現巨集 typedef int datatype define swap a,b 1.插入排序演算法 類似數學歸納法的描述 起始時a beg 的元素位置不變 此時a beg 這乙個元素已經有序 假設a beg a i beg i end 1 已經排好序,對a i 1 a end 依次將a...
內部排序演算法
內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列。1.快速排序int partition int a,int low,int high a low a high while low2.並歸排序 void merging int list1,int list1 size,i...
內部排序演算法
內部排序演算法就是指記憶體中的排序演算法,而外部排序演算法則是指待排序資料過多,無法一次性載入到記憶體中,排序過程需要讀取磁碟,因此需要考慮磁碟 io 的消耗!內部排序演算法按照操作型別可大致分為五類 插入排序 交換排序 選擇排序 歸併排序 計數排序 內部排序演算法按照時間複雜度可大致分為三類 簡單...