(C/C++) 基本排序法

C++ Class 宣告

 1 class Sort{
 2 private:
 3     void Merge(int *arr, int front, int mid, int end);
 4     int Partition(int *arr, int front, int end);
 5 public:
 6     void BubblesSort(int *arr, int size);
 7     void InsertSort(int *arr, int size);
 8     void MergeSort(int *arr, int front, int end);
 9     void QuickSort(int *arr, int front, int end);
10 };

排序法實現

 1 int Sort::Partition(int *arr, int front, int end){
 2     int pivot = arr[end];
 3     int i = front;
 4     for(int j = front; j < end; j++){
 5         if(arr[j] < pivot){
 6             swap(arr[j], arr[i]);
 7             i++;
 8         }
 9     }
10     swap(arr[i], arr[end]);
11     return i;
12 }
13 
14 void Sort::QuickSort(int *arr, int front, int end){
15     if(front < end){
16         int pivot = Partition(arr, front, end);
17         QuickSort(arr, front, pivot - 1);
18         QuickSort(arr, pivot + 1, end);
19     }
20 }
21 
22 void Sort::BubblesSort(int *arr, int size){
23     int len = size;
24     for(int i = 0; i < len; i++){
25         for(int j = i + 1; j < len; j++){
26             if(arr[j] < arr[i])
27                 swap(arr[i], arr[j]);
28         }
29     }
30 }
31 
32 void Sort::InsertSort(int *arr, int size)
33 {
34     int len = size;
35     int insert = 0;
36     for(int i = 1; i < len; i++){
37         insert = arr[i];
38         for(int j = i - 1; j >= 0; j--){
39             if(insert < arr[j])
40                 arr[j + 1] = arr[j];
41             else
42                 break;
43         }
44     }
45 }
46 
47 void Sort::Merge(int *arr, int front, int mid, int end){
48     int i, j, k;
49     int n1 = mid - front + 1;
50     int n2 = end - mid;
51     int LeftSub[n1];
52     int RightSub[n2];
53 
54     /* copy array */
55     for(i = 0; i < n1; i++)
56         LeftSub[i] = arr[front + i];
57     for(i = 0; i < n2; i++)
58         RightSub[i] = arr[mid + i + 1];
59 
60     i = 0; j = 0; k = front;
61     while(i < n1 && j < n2){
62         if(LeftSub[i] <= RightSub[j]){
63             arr[k] = LeftSub[i];
64             i++;
65         }else{
66             arr[k] = RightSub[j];
67             j++;
68         }
69         k++;
70     }
71     while(i < n1){
72         arr[k] = LeftSub[i];
73         i++; k++;
74     }
75     while(j < n2){
76         arr[k] = RightSub[j];
77         j++; k++;
78     }
79 }
80 
81 
82 void Sort::MergeSort(int *arr, int front, int end){
83     if(front < end){
84         int mid = (front + end) / 2;
85         MergeSort(arr, front, mid);
86         MergeSort(arr, mid + 1, end);
87         Merge(arr, front, mid, end);
88     }
89 }
90 
91 
92 void swap(int *a, int *b){
93     int temp;
94     temp = *a;
95     *a = *b;
96     *b = temp;
97 }

 

posted on 2018-12-02 22:30  OO程式猿  阅读(215)  评论(0编辑  收藏  举报

导航