1、冒泡排序
#include<iostream>
using namespace std;
const int N = 10000;
int main()
{
int n;
int num[N];
cout << "请你输入你要排序数的个数:";
cin >> n;
for (int i = 0; i < n; i++)
cin >> num[i];
//冒泡排序的核心就是逐个比较、交换
for(int i=0;i<n-1;i++)
for (int j = 0; j < n - 1; j++)
{
if (num[j] > num[j + 1])//如果左边比右边大则交换
{
int t = num[j];
num[j] = num[j + 1];
num[j + 1] = t;
}
}
for (int i = 0; i < n; i++)
cout << num[i] << " ";
system("pause");
return 0;
}
java写法
package javastudy01;
import java.util.Scanner;
/**
* @author shkstart
* @create 2022-03-11 11:59
* 冒泡排序
* 双重循环,每重循环只和相邻元素比较大小。
*/
public class Test01 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// int a = sc.nextInt();
int[] arr = new int[6];
//输入
for(int i = 0; i < 6; i++) arr[i] = sc.nextInt();
//冒泡排序
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
if(arr[i] < arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//输出
for(int i = 0; i < 6; i++) System.out.print(arr[i] + " ");
// System.out.println(a);
}
}
2、快速排序
快速排序是排序算法中时间复杂度为O(log(n))的算法。快排的写法有很多,建议大家多写写,看那种方式自己更能接受
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10000;
int num[N]; //全局数组
void sort_quick(int left,int right)
{
if (left >= right) return;
int i = left - 1, j = right + 1;
int x = num[(i + j) / 2];
while (i < j)
{
do i++; while (num[i] < x);
do j--; while (num[j] > x);
if (i < j) swap(num[i], num[j]);
}
sort_quick(left, j);
sort_quick(j + 1, right);
}
int main()
{
int n;
cout << "请你输入你要排序数的个数:";
cin >> n;
for (int i = 0; i < n; i++) cin >> num[i];
sort_quick(0, n - 1);
for (int i = 0; i < n; i++) cout << num[i] << " ";
system("pause");
return 0;
}
java写法
package javastudy01;
import java.util.Scanner;
/**
* @author shkstart
* @create 2022-03-11 11:59
* 快速排序
* 双指针算法
*/
public class Test01 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// int a = sc.nextInt();
int[] arr = new int[6];
//输入
for(int i = 0; i < 6; i++) arr[i] = sc.nextInt();
//快速排序
quicksort(arr, 0, arr.length - 1);
//输出
for(int i = 0; i < 6; i++) System.out.print(arr[i] + " ");
// System.out.println(a);
}
/**
* 快速排序
* @param arr
* @param l
* @param r
* @return
*/
public static void quicksort(int[] arr,int l, int r){
if(l >= r) return;
int mid = (l + r) / 2;
int i = l, j = r;
while(i < j){
while(arr[i] <= arr[mid] && i < mid) i++;
while(arr[j] >= arr[mid] && j > mid) j--;
if(i < j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//递归处理左边和右边
quicksort(arr, l, mid);
quicksort(arr, mid + 1, r);
}
}
3、插入排序
#include<iostream>
using namespace std;
const int N = 10000;
int num[N];
int n;
void insertsort()
{
for (int i = 1; i < n; i++)
{
int t = num[i], j = i;//t临时存放num[i]
//从i开始往前扫描,如果t比num[j]小,num[j]=num[j-1],j--;
while (t < num[j - 1] && j - 1 >= 0)
{
num[j] = num[j - 1];
j--;
}
num[j] = t;
}
}
int main()
{
cout << "请你输入你要排序数的个数:";
cin >> n;
for (int i = 0; i < n; i++) cin >> num[i];
insertsort();
for (int i = 0; i < n; i++) cout << num[i] << " ";
system("pause");
return 0;
}
4、选择排序
#include<iostream>
using namespace std;
const int N = 10000;
int num[N];
int n;
void selectsort()
{
for (int i = 0; i < n; i++)
{
int t = i;
for (int j = i; j < n; j++)
{
if (num[t] > num[j]) t = j;
}
int temp = num[t];
num[t] = num[i];
num[i] = temp;
}
}
int main()
{
cout << "请你输入你要排序数的个数:";
cin >> n;
for (int i = 0; i < n; i++) cin >> num[i];
selectsort();
for (int i = 0; i < n; i++) cout << num[i] << " ";
system("pause");
return 0;
}
5、归并排序
版本一
#include<iostream>
using namespace std;
const int N = 10000;
int num[N];
int n;
void merge(int l1, int r1, int l2, int r2)
{
int q[N], i, j, index = 0;
i = l1, j = l2;
while (i <= r1 && j <= r2)
{
if (num[i] < num[j]) q[index++] = num[i++];
else q[index++] = num[j++];
}
//左右序列剩余的放入q数组
while (i <= r1) q[index++] = num[i++];
while (j <= r2) q[index++] = num[j++];
//将q临时存储的数值放回num数组中
for (int k = 0; k < index; k++)
num[l1 + k] = q[k];
}
void mergesort(int left, int right)
{
int mid = (left + right) / 2;
if (left < right)
{
mergesort(left, mid);
mergesort(mid + 1, right);
merge(left, mid, mid + 1, right);//把左右两边合并
}
}
int main()
{
cout << "请你输入你要排序数的个数:";
cin >> n;
for (int i = 0; i < n; i++) cin >> num[i];
mergesort(0, n - 1);
for (int i = 0; i < n; i++) cout << num[i] << " ";
system("pause");
return 0;
}
版本二
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1000010;
int a[N], tem[N];
int n;
void merge_sort(int l, int r)
{
if(l >= r) return;
int mid = (l + r) / 2;
merge_sort(l, mid), merge_sort(mid + 1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r)
if(a[i] < a[j]) tem[k++] = a[i++];
else tem[k++] = a[j++];
while(i <= mid) tem[k++] = a[i++];
while(j <= r) tem[k++] = a[j++];
for(int i = l, j = 0; i <= r; i++, j++) a[i] = tem[j];
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
merge_sort(0, n - 1);
for(int i = 0; i < n; i++) printf("%d ", a[i]);
return 0;
}