七大排序

20 篇文章 0 订阅

1.冒泡排序
思想:两两比较,大的放后面,每一回都能得出最大值放在最后,然后开始新一轮。
解决:两个for循环,第一个用于控制长度,第二个用于比较
时复:O(n*n)
代码:


class BubbleSort {
public:
    int* bubbleSort(int* A, int n) {
        // write code here
        for(int i=n-1;i>0;i--) //用于存每一次的max
        {
            for(int j=0;j<i;j++)  //两两比较
            {
                if(A[j]>A[j+1])
                {
                    int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
                }
            }
        }
        return A;
    }
};

好久没写博客,因为新接了项目,导致一直没写算法,忏悔。

2.选择排序
思想:每次选出最小值
解决:两个for循环,第一个用于控制长度,第二个用于比较,需要一个min和key来记录每次的最小值和位置。
时复:O(n*n)
代码:

class SelectionSort {
public:
    int* selectionSort(int* A, int n) {
        // write code here
        for(int i=0;i<n;i++) //用于控制每一轮的循环和存放每次找出得min
        {
            int min=A[i];
            int key=i;;
            for(int j=i;j<n;j++)
            {
                if(A[j]<min)
                {
                    min=A[j];
                    key=j;
                }
            }
            int temp=A[i];
            A[i]=A[key];
            A[key]=temp;
        }
        return A;
    }
};

3.插入排序
思想:就是不断地把一个数组中的元素,未排序的元素不断插入到已成功排序的队列之中。
解决:用两个循环,外层控制当前需要排序的元素,内层用于对前几个有序数字进行比较。
时复:O(n*n)
代码:

class InsertionSort {
public:
    int* insertionSort(int* A, int n) {
        // write code here
        for(int i=1;i<n;i++)
        {
            for(int j=i;j>0;j--)
            {
                if(A[j]<A[j-1])
                {
                    int temp = A[j];
                    A[j]=A[j-1];
                    A[j-1]=temp;
                }
            }
        }
        return A;
    }
};

4.归并排序
思想:将一列数组不断对半分成一个个小组,直到每小组的元素个数为1的时候停止,然后相邻小组开始排序,自底向上排序。
解决:需要一个分组函数和一个排序函数,分组函数用递归的方式来划分数组,排序函数中需要加一个辅助数组,暂时将每次排序好的数组放入辅助数组,排序方式就是最简单的原理,即两个有序数组合并排序。
时复:O(n*logn)
代码:

// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;

void merge(int* A, int left, int mid, int right)
{
	vector<int> B(right - left+1);
	int j = mid + 1;
	int k = 0;
	int i = left;
	while (i <= mid&&j <= right)
	{
		if (A[i] > A[j])
		{
			B[k++] = A[j];
			j++;
		}
		else
		{
			B[k++] = A[i++];
		}
	}
	while(j <= right)  //前面部分元素排列完毕,后面的就不用动了
	{
		B[k++] = A[j++];
	}
	while (i <= mid)  //后面的排完了,把前面的放到最后
	{
		B[k++] = A[i++];
	}
	/*for (int i = 0; i < right - left + 1; i++)
	{
		cout << B[i] << " ";
	}
	cout << endl;*/
	//这里之所以一直报错是因为left是动态的,那么for的判断条件也是动态了,所以就出错了
	//解决方法有二,一是用一个m来接受left然后做A的下标,二就是left+i
	/*int m = left;
	for (int i = 0; i < right-left+1; i++)
	{
		A[left++] = B[i];
	}*/
	for (int i = 0; i < right - left + 1; i++)
	{
		A[left+i] = B[i];
	}
}

void sort(int *A, int left, int right)  //这个函数是用来把一个数组层层扒开,然后变成一个一个的
{
	if(left < right)
	{
		int mid = (left+right)/2;
		sort(A, left, mid);
		sort(A, mid + 1, right);
		merge(A, left, mid, right);
	}
}

void mergeSort(int* A, int n)
{
	// write code here
	sort(A, 0, n - 1);
}

int main()
{
	int *arr = new int[13];
	arr[0] = 54;
	arr[1] = 35;
	arr[2] = 48;
	arr[3] = 36;
	arr[4] = 27;
	arr[5] = 12;
	arr[6] = 44;
	arr[7] = 44;
	arr[8] = 8;
	arr[9] = 14;
	arr[10] = 26;
	arr[11] = 17;
	arr[12] = 28;
	mergeSort(arr,13);
	for (int i = 0; i < 13; i++)
		cout << arr[i]<<" ";
	delete[]arr;
	return 0;
}

5.快速排序
思想:一个数组,每次找中间下标的值,然后挨个比较,比mid小的值放前面,大的放后面,然后将mid左右各分组,然后继续找各自的mid,然后重复,直到每个组只剩一个。
解决:一个函数来不断分组一个用于排序,与归并不同的是,快排是先找枢纽值,然后排序然后分组,是不断交替进行的,所以是排序,分组分组这样一个递归关系。
时复:O(n*logn)
代码

// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;

int quicksort(int *A,int left, int right)
{
	if (left < right)
	{
		int mid = (left + right) / 2;
		int key = A[mid];//存放中间值
		vector<int> B(right-left+1);
		int j = 0; int k = right - left;
		for (int i = left; i <= right; i++)  //根据key值进行左右分组
		{
			if (A[i] < key)
			{
				B[j++] = A[i];
			}
			else if (A[i] >= key)
			{
				if (i != mid)
				{
					B[k--] = A[i];
				}
				else
				{
					continue;
				}
			}
		}
		B[j] = key;
		for (int i = left; i <= right; i++)
		{
			A[i] = B[i - left];
			cout << A[i] << " ";
		}
		cout << endl;
		//j每次都是从零开始的,不是枢纽值
		return j+left;
	}
	//这里因为有个if判断,若不满足if那么就会跳过这个代码没有返回值,所以需要一个return
	return 0;
}
void merge(int *A,int left, int right)
{
	if (left < right)
	{	
		int center = quicksort(A,left, right);
		merge(A, left, center-1);
		merge(A, center + 1, right);
	}	
}

void mergeSort(int* A, int n)
{
	// write code here
	merge(A, 0, n-1);
}

int main()
{
	int *arr = new int[13];
	arr[0] = 54;
	arr[1] = 35;
	arr[2] = 48;
	arr[3] = 36;
	arr[4] = 27;
	arr[5] = 12;
	arr[6] = 44;
	arr[7] = 44;
	arr[8] = 8;
	arr[9] = 14;
	arr[10] = 26;
	arr[11] = 17;
	arr[12] = 28;
	mergeSort(arr,13);
	cout << endl;
	for (int i = 0; i < 13; i++)
		cout << arr[i]<<" ";
	delete[]arr;
	return 0;
}

6…希尔排序
思想:给定一个数组,给定一个间隔值m,相隔m距离的两个数比较,然后不断缩小m,我是每次取前一次的一半,直到m等于1的时候进行简单的插入排序
解决:一个函数用来做递归,根据m的不同;一个用于排序,m>1之前就是简单比较加交换,m=1时就插入排序,刚好能复习一下插入排序
时复:O(n*logn)
代码

// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;

void sort(int *A, int n, int m)
{
	if (m > 1)
	{
		for (int i = 0; m + i < n; i++)
		{
			if (A[i] > A[i + m])
			{
				int temp = A[i];
				A[i] = A[i + m];
				A[i + m] = temp;
			}
		}
		for (int i = 0; i < n; i++)
		{
			cout << A[i] << " ";
		}
		cout << endl;
	}
	else
	{
		for (int i = 1; i < n; i++)
		{
			for (int j = 0; j < i; j++)
			{
				if (A[i] < A[j])
				{
					int temp = A[j];
					A[j] = A[i];
					A[i] = temp;
				}
			}
		}
	}
}
void shell(int *A, int n, int m)
{
	if (m>1 && m % 2 != 0)
		m = m / 2 + 1;
	else if(m>1 && m % 2==0)
		m = m / 2;
	if (m > 1)
	{
		sort(A, n, m);
		shell(A, n, m);
	}
	else if (m == 1)
	{
		sort(A, n, m);
	}
}
int* shellSort(int* A, int n) {
	// write code here
	int m = n;
	shell(A, n, m);
	return A;
}

int main()
{
	int *arr = new int[13];
	arr[0] = 54;
	arr[1] = 35;
	arr[2] = 48;
	arr[3] = 36;
	arr[4] = 27;
	arr[5] = 12;
	arr[6] = 44;
	arr[7] = 44;
	arr[8] = 8;
	arr[9] = 14;
	arr[10] = 26;
	arr[11] = 17;
	arr[12] = 28;
	shellSort(arr,13);
	cout << endl;
	for (int i = 0; i < 13; i++)
		cout << arr[i]<<" ";
	delete[]arr;
	return 0;
}

7.堆排序
等学完数据结构在写。

写了六个排序,让我把很不能理解的递归又加深理解了一点,唉,还是觉得自己好菜。
感谢我的朋友的耐心指导。
一起学算法的同学都不剩几个了,感谢自己没放弃,虽然我常常觉得自己不适合学计算机。
go on the road.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以回答这个问题。以下是七大排序的 C 语言代码: 1. 冒泡排序 void bubbleSort(int arr[], int n) { int i, j; for (i = ; i < n-1; i++) { for (j = ; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } 2. 选择排序 void selectionSort(int arr[], int n) { int i, j, min_idx; for (i = ; i < n-1; i++) { min_idx = i; for (j = i+1; j < n; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } int temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; } } 3. 插入排序 void insertionSort(int arr[], int n) { int i, key, j; for (i = 1; i < n; i++) { key = arr[i]; j = i - 1; while (j >= && arr[j] > key) { arr[j+1] = arr[j]; j = j - 1; } arr[j+1] = key; } } 4. 希尔排序 void shellSort(int arr[], int n) { int i, j, gap; for (gap = n/2; gap > ; gap /= 2) { for (i = gap; i < n; i++) { int temp = arr[i]; for (j = i; j >= gap && arr[j-gap] > temp; j -= gap) { arr[j] = arr[j-gap]; } arr[j] = temp; } } } 5. 归并排序 void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = ; i < n1; i++) { L[i] = arr[l + i]; } for (j = ; j < n2; j++) { R[j] = arr[m + 1 + j]; } i = ; j = ; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } void mergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } } 6. 快速排序 int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); int j; for (j = low; j <= high-1; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = temp; return (i + 1); } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi-1); quickSort(arr, pi+1, high); } } 7. 堆排序 void heapify(int arr[], int n, int i) { int largest = i; int l = 2*i + 1; int r = 2*i + 2; if (l < n && arr[l] > arr[largest]) { largest = l; } if (r < n && arr[r] > arr[largest]) { largest = r; } if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } void heapSort(int arr[], int n) { int i; for (i = n/2 - 1; i >= ; i--) { heapify(arr, n, i); } for (i = n-1; i >= ; i--) { int temp = arr[]; arr[] = arr[i]; arr[i] = temp; heapify(arr, i, ); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值