面试笔试排序算法

 1 // 冒泡排序
 2 // 2个相邻的元素相互比较,不满足顺序则交换;每遍历一次数组,使一个元素处于最终位置。
 3 void BubbleSort(std::vector<int>& nums)
 4 {
 5     if(nums.empty())
 6     {
 7         return;
 8     }
 9 
10     bool sorted = false; // 假设没有排好序
11     size_t n = nums.size();
12 
13     while(!sorted)
14     {
15         sorted = true; // 假设已经排好序
16         for(int i = 1; i < n; ++i)
17         {
18             if(nums[i-1] > nums[i])
19             {
20                 std::swap(nums[i-1], nums[i]);
21                 sorted = false; // 恢复为已排好序
22             }
23         }
24         --n; // 已经排好序的元素不必再参与排序了
25     }
26 }
27 
46 // 快速排序
47 // 随机在数组中选择一个元素,作为划分元素,将数组中比划分元素小的交换到左侧,
48 // 比划分元素大的交换到右侧,最后将划分元素交换到左右区间的连接处,则划分元素处于了最终位置;
49 // 递归地对左右区间进行快速排序。
50 int Partition(vector<int>& vec, int low, int up)
51 {
52     int pivot = vec[up];
53     int i = low - 1;
54 
55     for(int j = low; j < up; ++j)
56     {
57         if(vec[j] <= pivot)
58         {
59             ++i;
60             std::swap(vec[i], vec[j]);
61         }
62     }
63     std::swap(vec[i+1], vec[up]);
64 
65     return i+1;
66 }
67 
68 void QuickSort(vector<int>& vec, int low, int up)
69 {
70     if(low < up)
71     {
72         int mid = Partition(vec, low, up);
73 
74         QuickSort(vec, low, mid - 1);
75         QuickSort(vec, mid + 1, up);
76     }
77 }

 

 1 /*
 2     插入排序
 3 */
 4 void InsertionSort(std::vector<int>& vec)
 5 {
 6     int num = vec.size();
 7 
 8     for (int i = 1; i < num; ++i)
 9     {
10         for (int j = i; j > 0 && vec[j] < vec[j - 1]; --j)
11         {
12             std::swap(vec[j], vec[j - 1]);
13         }
14     }
15 }

 

 1 /*
 2     归并排序
 3 */
 4 
 5 class MergeSort
 6 {
 7 public:
 8     void merge(std::vector<int>& vec, int low, int mid, int high)
 9     {
10         int i = low; int j = mid + 1;
11 
12         for (int k = low; k <= high; ++k)
13         {
14             aux_[k] = vec[k];
15         }
16 
17         for (int k = low; k <= high; ++k)
18         {
19             if (i > mid)
20             {
21                 vec[k] = aux_[j++];
22             }
23             else if (j > high)
24             {
25                 vec[k] = aux_[i++];
26             }
27             else if (aux_[j] < aux_[i])
28             {
29                 vec[k] = aux_[j++];
30             }
31             else
32             {
33                 vec[k] = aux_[i++];
34             }
35         }
36     }
37 
38     void merge_sort(std::vector<int>& vec, int low, int high)
39     {
40         if (low >= high)
41         {
42             return;
43         }
44 
45         int mid = low + (high - low) / 2;
46 
47         merge_sort(vec, low, mid);
48         merge_sort(vec, mid + 1, high);
49         merge(vec, low, mid, high);
50     }
51 
52     void sort(std::vector<int>& vec, int low, int high)
53     {
54         aux_.resize(vec.size());
55         merge_sort(vec, 0, vec.size() - 1);
56     }
57 
58 private:
59     static std::vector<int> aux_;
60 };
61 
62 std::vector<int> MergeSort::aux_;

 

/*
选择排序
*/
void SelectionSort(std::vector<int>& vec)
{
    int num = vec.size(); // 向量大小

    for (int i = 0; i < num; ++i) // 外循环 从下标0开始
    {
        int min = i; // 最小元素的下标

        for (int j = i + 1; j < num; ++j) // 从i的下一个元素开始
        {
            if (vec[j] < vec[min])
            {
                min = j;
            }
        }
        std::swap(vec[i], vec[min]);
    }
}

 

posted @ 2016-09-21 13:41  Ricardo  阅读(279)  评论(0编辑  收藏  举报