【个人】排序练习

插入排序:

#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
 for(int i = 0; i < n; i++) {
  cout<<a[i]<<" ";
 }
 cout<<endl;
}

int main(){
 int a[105];
 memset(a,0,sizeof(a));
 int n;
 cin>>n;
 for(int i = 0; i < n; i++) {
    cin>>a[i];
 }
 for(int i = 0; i < n; i++) {
  int temp = a[i];
  int j = i - 1;
  while(j >= 0 && a[j] > temp){
   a[j+1] = a[j];
   j--;
  }
  a[j+1] = temp;
  output(a, n);
 }
 return 0;
}

插入排序,幻想成是你在抓扑克牌的时候。以i为分割线,i之前的扑克牌都是已经拍好顺序的了。

所以你需要在i进行插入的时候,和它前面的一个个比较,若前面的要大于它,就覆盖,直到找到一个小于它的数j,就放在这个数的后面。

插入排序可以高速整理顺序很整齐的数据。

冒泡排序

#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
 for(int i = 0; i < n; i++) {
  cout<<a[i]<<" ";
 }
 cout<<endl;
}

int main(){
 int a[105];
 memset(a,0,sizeof(a));
 int n;
 int times=0;
 cin>>n;
 for(int i = 0; i < n; i++) {
    cin>>a[i];
 }
 for(int i = 0; i < n; i++) {
  for(int j = n-1; j >= i + 1; j--) {
    if(a[j-1] > a[j]) {
        int temp = a[j];
        a[j] = a[j-1];
        a[j-1] = temp;
        times++;
    }
  }
 }
 output(a, n);
 cout<<times;
 return 0;
}

从高处开始,往底层两个两个的判断。就好像泡泡一样把小的往前面送了。一趟完成后,之前未排序部分的第一个肯定是剩下数里最小的。

选择排序

#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
 for(int i = 0; i < n; i++) {
  cout<<a[i]<<" ";
 }
 cout<<endl;
}

int main(){
 int a[105];
 memset(a,0,sizeof(a));
 int n;
 int times=0;
 cin>>n;
 for(int i = 0; i < n; i++) {
    cin>>a[i];
 }
 for(int i = 0; i < n; i++) {
  int index = i;
  for(int j = i + 1; j < n; j++) {
    if(a[index] > a[j]){
        index = j;
    }
  }
  if(index != i){
    int temp = a[index];
    a[index] = a[i];
    a[i] = temp;
    times++;
  }
 }
 output(a, n);
 cout<<times;
 return 0;
}

就是一趟趟地走,每次选择那个最小/大的。

选择排序不一定是一种稳定的算法。如果最小的那个数字和重复大数字交换排序后,就会出现位置变换了。

希尔排序

#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void output(int a[], int n){
 for(int i = 0; i < n; i++) {
  cout<<a[i]<<endl;
 }
}

void insertion(int a[], int n, int g, int &times) {
 for(int i = 0; i < n; i++) {
    int temp = a[i];
    int j = i-g;
    while(j >= 0 && a[j] > temp) {
        a[j+g] = a[j];
        j = j - g;
        times++;
    }
    a[j+g] = temp;
 }
}

int main(){
 int a[105];
 memset(a,0,sizeof(a));
 int n;
 int times=0;
 cin>>n;
 for(int i = 0; i < n; i++) {
    cin>>a[i];
 }

 vector<int> gs;
 for(int h=1;;){
    if(h>n) break;
    gs.push_back(h);
    h = 3*h + 1;
 }

 for(int i = gs.size()-1; i >= 0; i--) {
    insertion(a, n, gs[i], times);
 }

 cout<<gs.size()<<endl;
 for(int i = gs.size()-1; i >= 0; i--) {
    cout<< gs[i]<<" ";
 }
 cout<<endl;
 cout<<times<<endl;
 output(a, n);
 return 0;
}

希尔排序是加工过后的插入排序。

是按间隔来分别进行插入排序。这个间隔的算法是按照那个复杂度来的吧,这个题的要求是O(N1.25),所以题目用了gn+1=3gn+1;

原文地址:https://www.cnblogs.com/rimochiko/p/8557744.html