アルゴリズムのガイドライン:クイックソートと挿入ソート

12667 ワード

コード実装

 1 #ifndef _SORT_H

 2 #define _SORT_H

 3 

 4 // goal: quicksort and insertsort

 5 // time: 12/2/2014

 6 // author: zrss

 7 // reference: introduction to algorithms

 8 

 9 class Sort {

10 public:

11     void quickSort(int A[], int p, int r);

12     void insertSort(int A[], int p, int r);

13 

14 private:

15     int partition(int A[], int p, int r); // for quickSort

16 };

17 

18 int Sort::partition(int A[], int p, int r) {

19     int x = A[r]; // use A[r] as pivot node

20     

21     int i = p - 1; // point to left part

22 

23     // divide A array to three part

24     // A[p - i] <= x

25     // A[(i + 1) - j] > x

26     // A[(j + 1) - r) unknown

27     for (int j = p; j < r; ++j) {

28         if (A[j] <= x) {

29             ++i;

30             if (i != j) { // swap A[i] and A[j]

31                 int temp = A[i];

32                 A[i] = A[j];

33                 A[j] = temp;

34             }

35         }

36     }

37 

38     // exchange A[i + 1] and A[r]

39     A[r] = A[i + 1];

40     A[i + 1] = x;

41 

42     return (i + 1);

43 }

44 

45 void Sort::quickSort(int A[], int p, int r) {

46     if (p < r) {

47         int q = partition(A, p, r);

48         quickSort(A, p, q - 1);

49         quickSort(A, q + 1, r);

50     }

51 }

52 

53 void Sort::insertSort(int A[], int p, int r) {

54     for (int j = p + 1; j <= r; ++j) {

55         int key = A[j];

56         int i = j - 1;

57         while (i >= p && A[i] > key) { // move backward

58             A[i + 1] = A[i];

59             --i;

60         }

61 

62         if (i + 1 != j) { // insert A[j] to right position

63             A[i + 1] = key;

64         }

65     }

66 }

67 

68 

69 #endif

ソートの挿入とクイックソートの実行時間の比較


100000個のintテストデータをランダムに生成
 1 #include <cstdio>

 2 #include <cstdlib>

 3 #include "windows.h"

 4 #include "sort.h"

 5 

 6 int main(void) {

 7     const int length = 100000;

 8     int number[length];

 9 

10     for (int i = 0; i < length; ++i) {

11         number[i] = rand();

12     }

13 

14     Sort sort;

15 

16     DWORD st = GetTickCount();

17 

18     sort.insertSort(number, 0, length - 1);

19     //sort.quickSort(number, 0, length - 1);

20 

21     DWORD ed = GetTickCount();

22 

23     printf("InsertSort use time: %dms
", ed - st); 24 //printf("QuickSort use time: %dms
", ed - st);
25 26 system("pause"); 27 return 0; 28 }

InsertSort use time: 2200ms
QuickSort use time: 0ms

システム情報


System: Windows 7 professional Service Pack 1
CPU: Intel(R) Pentium(R) Dual CPU E2220 @ 2.40GHz 2.40GHz
Memory: 3.00 GB

結論


入力が100,000桁で、入力データがランダム値の場合、高速ソートの効率はソートの挿入よりも優れています.