美文网首页
排序算法详细代码实现

排序算法详细代码实现

作者: Catcher07 | 来源:发表于2018-07-11 09:18 被阅读0次

    算法分类

    image.png

    算法时间复杂度

    image.png

    选择排序

    void select_sort(vector<int> &a) {
        int m = a.size();
        for (int i = 0; i < m; i++) {
            int minIndex = i;
            for (int j = i + 1; j < m; j++) {
                if (a[j] < a[minIndex]) {
                    minIndex = j;
                }
            }
            swap(a[i], a[minIndex]);
        }
    }
    

    插入排序

    C++实现

    void insert_sort(vector<int> &a) {
        int m = a.size();
        for (int i = 0; i < m; i++) {
            int j = i;
            while (j > 0 && a[j] < a[j - 1]) {
                swap(a[j], a[j - 1]);
                j--;
            }
        }
    }
    

    Python实现

    1.  class Insert_sort:  
    2.      ''''' 
    3.      插入排序 
    4.      :type nums: List[int] 要排序的数组 
    5.      '''  
    6.    
    7.      def sort(self, nums):  
    8.          ''''' 
    9.          用swap的插入排序 
    10.         :type nums: List[int] 要排序的数组 
    11.         '''  
    12.         m = len(nums)  
    13.         for i in range(m):  
    14.             j = i  
    15.             while j > 0 and nums[j] < nums[j-1]:  
    16.                 nums[j], nums[j-1] = nums[j-1], nums[j]  
    17.                 j -= 1  
    18.   
    19.     def sort_2(self, nums):  
    20.         ''''' 
    21.         标准插入排序 
    22.         :type nums: List[int] 要排序的数组 
    23.         '''  
    24.         m = len(nums)  
    25.         for i in range(m):  
    26.             key = nums[i]  
    27.             j = i-1  
    28.             while j >= 0 and nums[j] > key:  
    29.                 nums[j+1] = nums[j]  
    30.                 j -= 1  
    31.             nums[j+1] = key  
    
    

    冒泡排序

    //冒泡排序
    void bubble_sort(vector<int> &a) {
        int m = a.size();
        for (int i = m - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a[j], a[j + 1]);
                }
            }
        }
    }
    
    //冒泡排序2
    void bubble_sort2(vector<int> &a) {
        int m = a.size();
        for (int i = 0; i < m - 1; i++) {
            bool flag = true;
            for (int j = 0; j < m - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a[j], a[j + 1]);
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }
    

    Python实现

    class Bubble_sort:
        '''
        冒泡排序
        '''
    
        def sort(self, nums):
            '''
            标准版冒泡排序
            :type nums: List[int] 要排序的数组
            '''
            m = len(nums)
            for i in range(m-1, -1, -1):
                for j in range(i):
                    if nums[j] > nums[j+1]:
                        nums[j], nums[j+1] = nums[j+1], nums[j]
    
        def sort_optimize(self, nums):
            '''
            优化版冒泡排序
            :type nums: List[int] 要排序的数组
            '''
            m = len(nums)
            for i in range(m-1, -1, -1):
                is_sorted = True
                for j in range(i):
                    if nums[j] > nums[j+1]:
                        nums[j], nums[j+1] = nums[j+1], nums[j]
                        is_sorted = False
                if is_sorted:
                    break
    

    归并排序

    Python实现

    1.  class Merge_sort:  
    2.      ''''' 
    3.      归并排序 
    4.      '''  
    5.    
    6.      def sort(self, nums):  
    7.          ''''' 
    8.          : type nums: List[int] 要排序的数组 
    9.          '''  
    10.         self.merge_sort(nums, 0, len(nums)-1)  
    11.   
    12.     def merge_sort(self, nums, left, right):  
    13.         if left < right:  
    14.             mid = (left + right)//2  
    15.             self.merge_sort(nums, left, mid)  
    16.             self.merge_sort(nums, mid+1, right)  
    17.             self.merge_arr(nums, left, mid, right)  
    18.   
    19.     def merge_arr(self, nums, left, mid, right):  
    20.         m = right - left + 1  
    21.         helper_arr = [0]*m  
    22.         i, j = left, mid+1  
    23.         for k in range(m):  
    24.             if self.less(nums, i, j, mid, right):  
    25.                 helper_arr[k] = nums[i]  
    26.                 i += 1  
    27.             else:  
    28.                 helper_arr[k] = nums[j]  
    29.                 j += 1  
    30.   
    31.         for i in range(left, right+1):  
    32.             nums[i] = helper_arr[i - left]  
    33.   
    34.     def less(self, nums, i, j, mid, right):  
    35.         if j > right or (i <= mid and nums[i] <= nums[j]):  
    36.             return True  
    37.         return False  
    

    堆排序

    // 和c++的模板库稍微的区别是 他把_siftup和_siftdown合在一起写
    void adjust_heap(vector<int> &a, int parent, int length) {
        int temp = a[parent], j = parent * 2 + 1;
        while (j < length) {
            if (j + 1 < length && a[j] < a[j + 1]) {
                j++;
            }
            if (temp > a[j]) {
                break;
            } else {
                a[parent] = a[j];
                parent = j;
                j = 2 * parent + 1;
            }
        }
        a[parent] = temp;
    }
    
    void heap_sort(vector<int> &a) {
        int m = a.size();
        for (int i = m / 2 - 1; i >= 0; i--) {
            adjust_heap(a, i, m);
        }
    
        for (int i = m - 1; i >= 0; i--) {
            swap(a[i], a[0]);
            adjust_heap(a, 0, i);
        }
    }
    

    Python实现

    1.  class Heap_sort:  
    2.      ''''' 
    3.      堆排序 
    4.      '''  
    5.    
    6.      def sort(self, nums):  
    7.          ''''' 
    8.          :type nums: List[int] 要排序的数组 
    9.          '''  
    10.         m = len(nums)  
    11.         for i in range(m//2-1, -1, -1):  
    12.             self.adjust_heap(nums, i, m)  
    13.         for i in range(m-1, -1, -1):  
    14.             nums[i], nums[0] = nums[0], nums[i]  
    15.             self.adjust_heap(nums, 0, i)  
    16.   
    17.     def adjust_heap(self, nums, parent, length):  
    18.         ''''' 
    19.         堆调整算法 
    20.         :type nums: List[int] 要排序的数组 
    21.         :type parent: int 要调整的父节点 
    22.         :type length: int 要调整的数组长度 
    23.         '''  
    24.         orgin_parent_value, childpos = nums[parent], 2*parent+1  
    25.         while childpos < length:  
    26.             rightpos = childpos+1  
    27.             if rightpos < length and nums[rightpos] >= nums[childpos]:  
    28.                 childpos = rightpos  
    29.             if nums[childpos] < orgin_parent_value:  
    30.                 break  
    31.             else:  
    32.                 nums[parent] = nums[childpos]  
    33.                 parent = childpos  
    34.             childpos = 2*parent+1  
    35.         nums[parent] = orgin_parent_value  
    

    快速排序

    int Partition(vector<int> &a, int left, int right) {
        int i = left, j = right + 1;
        int x = a[left];
        while (true) {
            while (a[++i] < x && i < right);
            while (a[--j] > x);
            if (i >= j) {
                break;
            }
            swap(a[i], a[j]);
        }
        swap(a[left], a[j]);
        return j;
    }
    void QuickSort(vector<int> &a, int left, int right) { 
        if (left < right) {
            int position = Partition(a, left, right);
            QuickSort(a, left, position - 1);
            QuickSort(a, position + 1, right);
        }
    }
    

    Python实现稍有不同

    class Quick_sort:
    
        def sort(self, nums):
            '''
            快速排序
            :type nums: List[int] 要排序的数组
            '''
            self.quick_sort(nums, 0, len(nums)-1)
            # print(sorted(nums))
    
        def quick_sort(self, nums, left, right):
            '''
            :type nums: List[int] 要排序的数组
            '''
            if left < right:
                index = self.partition(nums, left, right)
                self.quick_sort(nums, left, index-1)
                self.quick_sort(nums, index+1, right)
    
        def partition(self, nums, left, right):
            pivot, i, j = nums[left], left, right
            while i < j:
                while i < j and nums[j] >= pivot:
                    j -= 1
                nums[i] = nums[j]
                while i < j and nums[i] <= pivot:
                    i += 1
                nums[j] = nums[i]
            nums[i] = pivot
            return i
    

    shell排序

    class shell_Solution {
      public:
        void sort(vector<int> &num) {
            int m = num.size();
            for (int gap = m / 2; gap > 0; gap /= 2) {
                for (int i = gap; i < m; i++) {
                    int j = i;
                    while (j - gap >= 0 && num[j] < num[j - gap]) {
                        swap(num[j], num[j - gap]);
                        j = j - gap;
                    }
                }
            }
        }
    };
    

    Python实现

    1.  class Shell_sort:  
    2.      ''''' 
    3.      shell排序 
    4.      :type nums: List[int] 要排序的数组 
    5.      '''  
    6.    
    7.      def sort(self, nums):  
    8.          ''''' 
    9.          :type nums: List[int] 要排序的数组 
    10.         '''  
    11.         m = len(nums)  
    12.         gap = m//2  
    13.         while gap > 0:  
    14.             for i in range(gap, m):  
    15.                 j = i  
    16.                 while j - gap >= 0 and nums[j] < nums[j - gap]:  
    17.                     nums[j], nums[j - gap] = nums[j - gap], nums[j]  
    18.                     j = j - gap  
    19.             gap = gap//2  
    20.   
    21.     def sort_2(self, nums):  
    22.         m = len(nums)  
    23.         gap = m//2  
    24.         while gap > 0:  
    25.             for i in range(gap, m):  
    26.                 j, key = i, nums[i]  
    27.                 while j - gap >= 0 and key < nums[j - gap]:  
    28.                     nums[j] = nums[j - gap]  
    29.                     j -= gap  
    30.                 nums[j] = key  
    31.             gap //= 2  
    

    相关文章

      网友评论

          本文标题:排序算法详细代码实现

          本文链接:https://www.haomeiwen.com/subject/ghbcpftx.html