选择排序

C++

简单选择排序

#include <iostream>
#define N 10
using namespace std;

void selectSort(int r[], int n)
{
    int i, j, minIndex;
    for (i = 0; i < n - 1; i++) // 排序
    {
        minIndex = i;
        for (j = i + 1; j < n; j++) //找最小值
        {
            if (r[minIndex] > r[j])
            {
                minIndex = j;  // 记录最小值下标
            }
        }
        if (minIndex != i)
        {   
            swap(r[i], r[minIndex]);
        }
    }
}

int main()
{
    int numbers[N] = { 3,2,1,5,6,2,8,6,9,7 };
    selectSort(numbers, N);
    for (int i = 0; i < N; i++)
        cout << numbers[i] << " ";
    cout << "\n";
    return 0;
}

堆排序

#include <iostream>
#define N 10
using namespace std;
// 下沉操作
void sink(int r[], int k, int n)
{
	int j;
	while (2 * k + 1 < n)  //如果有左孩子
	{
		j = 2 * k + 1; // 指向左孩子  
		// 如果有右孩子,且右孩子大于左孩子,则指向右孩子
		if (j + 1 < n && r[j] < r[j + 1])j++;
		// 父节点比较大的孩子大,则满足堆
		if (r[k] >= r[j]) break;
		else swap(r[k], r[j]); // 否则父节点与较大孩子交换
		k = j; // k为父节点交换后的位置,继续向下比较
	}
}


void heapSort(int r[], int n)
{
	// 构建初始堆
	for (int i = n / 2 - 1; i >= 0; i--) sink(r, i, n);
	// 堆排序
	while (n > 0)
	{
		// 堆顶和最后一个记录交换,交换后n减1
		swap(r[0], r[n - 1]);
		n--;    // 待排序节点-1
		sink(r, 0, n);  // 堆顶下沉
	}
}
int main()
{
	int numbers[N] = { 3,2,1,5,6,2,8,6,9,7 };
	heapSort(numbers, N);
	for (int i = 0; i < N; i++)
		cout << numbers[i] << " ";
	cout << "\n";
	return 0;
}

python

简单选择排序

def select_sort(r, n):
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if r[j] < r[min_index]:
                min_index = j
        if (min_index != i):
            r[i], r[min_index] = r[min_index], r[i]


if __name__ == '__main__':
    r = [3, 2, 1, 5, 6, 2, 8, 6, 9, 7]
    select_sort(r, len(r))
    print(r)

堆排序

def sink(r, k, n):
    while 2 * k + 1 < n:
        j = 2 * k + 1
        if (j + 1 < n) and (r[j] < r[j + 1]):
            j += 1
        if r[k] < r[j]:
            r[k], r[j] = r[j], r[k]
        else:
            break
        k = j

def heap_sort(r, n):
    # 构建初始堆
    for i in range(int(n / 2) - 1, -1,-1):
        sink(r, i, n)
    while n > 0:
        r[0], r[n - 1] = r[n - 1], r[0]
        n -= 1
        sink(r, 0, n)


if __name__ == '__main__':
    r = [3, 2, 1, 5, 6, 2, 8, 6, 9, 7]
    heap_sort(r, len(r))
    print(r)