排序算法详细代码实现

算法分类

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  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 快速排序 快速排序算法是基于分治策略的一种排序算法,它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其...
    哎哟喂程序猿阅读 340评论 0 0
  • 冒泡排序 1 具体实现 2 分析 通过函数图像很容易得到: 由以上可以得到冒泡排序的时间复杂度为:F(n) = O...
    小王啊_阅读 216评论 0 0
  • 几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各...
    ReentrantSucc阅读 560评论 0 2
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,732评论 0 15
  • 对于经常投资的人来讲,公募基金和私募基金这两个名词并不陌生,对概念也都有一定了解,但有时候让你去给别人讲一下,可能...
    诺曼底的救赎阅读 423评论 0 0