排序算法总结

这篇文章包含一些408常考的排序算法的代码实现

 c++ 版本

#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/***
*这个头文件包括一些408常见的排序算法:
* 1.insertSort 直接插入排序
* 2.shellSort 希尔排序
* 3.bubbleSort 冒泡排序
* 4.quickSort 快速排序
* 5.selectionSort 简单选择排序
* 6.heapSort 堆排序
* 7.countingSort 计数排序
***/
class Sort {
public:
	void insertSort(vector<int> &a) {
		int i, j, temp;
		for (i = 1; i < a.size(); ++i) {
			if (a[i] < a[i - 1]) {
				for (j = i - 1; j >= 0 && a[j] > temp; --j) {
					a[j + 1] = a[j];
				}
				a[j + 1] = temp;
			}
		}
	}
	void shellSort(vector<int> &a) {
		int dk, i, j;
		int n = a.size();
		for (dk = n / 2; dk >= 1; dk = dk / 2) {   // 划分子表的过程
			for (i = dk+1; i <= n; ++i) {    // 子表中直接插入排序的过程
				if (a[i] < a[i - dk]) {
					a[0] = a[i]; // a[0]用来暂存不符合要求的元素
					for (j = i - dk; j > 0 && a[j] > a[0]; j -= dk) {
						a[j + dk] = a[j];
					}
					a[j + dk] = a[0];
				}
			}
		}
	}// 1,5,3,2,4,3,9  -> 1, 5, 5,
	void bubbleSort(vector<int> &a) {
		int n = a.size();
		for (int i = 0; i < n-1; ++i) {
			bool flag = true;
			for (int j = n-1; j > i; --j) {
				if (a[j] < a[j - 1]) {
					swap(a[j], a[j - 1]);
					flag = false;
				}
				if (flag) { return; }
			}
		}
	}
	// 定义分区函数
	int partition(vector<int>& a, int l, int r) {
		int pivot = a[l]; // 定义一个变量存放枢轴,左边左右数比他小,右边所有数字比他大
		while (l < r) {
			while (l < r && a[r] >= pivot) { r--; } // while 循环从右往左找,直到找到第一个比数轴小的数字
			a[l] = a[r];  // 直接覆盖枢轴所在的位置,因为此时我们已经用一个变量pivot存放了这个枢轴
			while (l < r && a[l] <= pivot) { l++; }// while 循环从左往右边找,直到找到第一个比枢轴大的数字
			a[r] = a[l]; // 覆盖之前r指针停留的位置,因为此时我们已经用a[l]存放了从右往左找第一个比pivot大的数字
		}
		a[l] = pivot;   // l == r 时所有数字都被分配到两端,l所指的位置是pivot应该所处的位置
		return l;
	}
	void quickSort(vector<int>& a, int l, int r) {
		if (l < r) {
			int pivotPos = partition(a, l, r);
			quickSort(a, l, pivotPos - 1);
			quickSort(a, pivotPos + 1, r);
		}
	}
	void selectionSort(vector<int>& a) {
		int n = a.size();
		for (int i = 0; i < n; ++i) {
			int m = i;
			for (int j = i; j < n; ++j) {
				if (a[j] < a[m]) { m = j; }
			}
			if (m != i) { swap(a[i], a[m]); }
		}
	}
	// 下面是堆排序的代码实现
	void heapfiy(vector<int> &a, int n, int i) { // 调整堆的函数,首先传入的是最小堆的堆顶编号
		int largest = i;
		int left = 2 * i + 1;
		int right = 2 * i + 2;
		if (left < n && a[left] > a[largest]) {
			largest = left;
		}
		if (right < n && a[right] > a[largest]) {
			largest = right;
		}
		if (largest != i) {
			swap(a[i], a[largest]);
			heapfiy(a, n, largest);
		}
	}
	void heapSort(vector<int>& a) {
		int n = a.size();
		for (int i = n / 2 - 1; i >= 0; --i) {
			heapfiy(a, n, i);
		}
		for (int i = n - 1; i > 0; --i) {
			swap(a[0], a[i]);
			heapfiy(a, i, 0);
		}
	}
	void countingSort(vector<int> &a) {
		int n = a.size();
		vector<int> res;
		int volumn = *max_element(a.begin(), a.end());
		vector<int> cnt(volumn + 1, 0);
		for (int i = 0; i < n; ++i) {
			cnt[a[i]]++;
		}
		int idx = 0;
		for (int i = 0; i < cnt.size(); ++i) {
			while (cnt[i]--) {
				a[idx++] = i;
			}
		}
	}


};

python版本

### 这个封装的类中包含了一些408常见的排序算法
import random
class Sort:
    def __init__(self,a):
        self.a = a
        self.n = len(a)

    def insertSort(self):
        for i in range(1,self.n):
            if self.a[i-1] > self.a[i]:
                temp = self.a[i]
                j = i-1
                while j >= 0 and self.a[j] > temp:
                    self.a[j+1] = self.a[j]
                    j-=1
                self.a[j+1] = temp

    def BubbleSort(self):
        for i in range(self.n-1):
            flag = True
            for j in range(self.n-1,i,-1):
                if a[j] < a[j-1]:
                    a[j],a[j-1] = a[j-1],a[j]
                    flag = False
            if flag:return

    def partition(self,l,r):
        pivot = self.a[l]
        while l < r:
            while l < r and a[r] >= pivot:
                r -= 1
            self.a[l] = self.a[r]
            while l < r and self.a[l] <= pivot:
                l += 1
            self.a[r] = self.a[l]
        self.a[l] = pivot
        return l

    def qsort(self,l,r):
        if l < r:
            pivotPos = self.partition(l,r)
            self.qsort(pivotPos+1,r)
            self.qsort(l,pivotPos-1)

    def selectSort(self):
        for i in range(self.n):
            m = i
            for j in range(i+1,self.n):
                if self.a[j] < self.a[m]:
                    m = j
            self.a[i],self.a[m] = self.a[m],self.a[i]

    def heapify(self,n,i):
        largest = i
        left = 2 * i + 1
        right = 2 * i + 2
        if left < n and self.a[largest] < self.a[left]:
            largest = left
        if right < n and self.a[largest] < self.a[right]:
            largest = right
        if largest != i:
            a[largest],a[i] = a[i],a[largest]
            self.heapify(n,largest)

    def heapSort(self):
        n = len(self.a)
        for i in range(int(n/2) - 1,-1,-1):
            self.heapify(n,i)

        for i in range(n-1,0,-1):
            a[i],a[0] = a[0],a[i]
            self.heapify(i,0)  # 维护堆顶

if __name__ == '__main__':
    a = [random.randint(1, 29) for _ in range(6)]
    print(a)
    s = Sort(a)
    s.heapSort()
    print(a)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值