日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

纯手打常见基础排序

發(fā)布時間:2024/1/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纯手打常见基础排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 冒泡排序
  • 選擇排序
  • 插入排序
  • 快速排序
  • 歸并排序
  • 堆排序

冒泡排序

相鄰的比較,復合條件就交換,需要走n-1趟
時間復雜度O(n^2)

#include<bits/stdc++.h> using namespace std; const int N=10005; //核心思想: //相鄰的兩個比較,滿足條件就交換 //從第一個元素開始,每結束一次循環(huán)就能確定一個最值 //所以需要循環(huán)n-1趟 int main(){int n;cin>>n;int a[N];for(int i=1;i<=n;i++)cin>>a[i];//核心開始了//冒泡排序,只需要走n-1趟 for(int i=1;i<n;i++)for(int j=1;j<=n-i;j++)if(a[j]>a[j+1]) swap(a[j],a[j+1]);for(int i=1;i<=n;i++)cout<<a[i]<<' '; return 0; }

選擇排序

每次選出最小值放在前面
時間復雜度O(n^2)

#include<bits/stdc++.h> using namespace std; const int N=10005; //核心思想 //從第一個開始,每次選出后面最小值,然后交換 // int main(){int n;cin>>n;int a[N];for(int i=1;i<=n;i++)cin>>a[i];//正式開始//核心思想: 遍歷數(shù)組,每次選出最小的放在前面for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++){int min=i;//記錄最小值下標 if(a[min]>a[j]) min=j;swap(a[i],a[min]);}for(int i=1;i<=n;i++)cout<<a[i]<<' ';return 0; }

插入排序

時間復雜度O(n^2)

#include<bits/stdc++.h> using namespace std; const int N=10005; int main(){int n;cin>>n;int a[N];for(int i=1;i<=n;i++)cin>>a[i];//核心for(int i=1;i<=n;i++){int key=a[i];int j=i-1;while((j>=1)&&a[j]>key){//后移 a[j+1]=a[j];j--;}a[j+1]=key;} for(int i=1;i<=n;i++)cout<<a[i]<<' ';return 0; }

快速排序

選出一個基數(shù),大于基礎的放右邊,小于基數(shù)的放左邊
快速排序的優(yōu)點在于: 對于 規(guī)模大且無序 的數(shù)組具有非常高的效率
時間復雜度O(nlogn)

#include<bits/stdc++.h> using namespace std; const int N=10005; //核心思想 //選出一個基數(shù),比基數(shù)大的放右邊,小的放左邊 void quick_sort(int a[],int l,int r){//結束條件 if(l>=r)return;//在做循環(huán)的時候,要先自增,所以要先減1 int i=l-1,j=r+1,x=a[l+r>>1];//循環(huán)結束之后,//1~~j <=a[x]// j+1~r >=a[x] while(i<j){do{i++;}while(a[i]<x);do{j--;}while(a[j]>x);if(i<j)swap(a[i],a[j]); } //子問題 quick_sort(a,l,j);//左邊 quick_sort(a,j+1,r);//右邊 } int main(){int n;cin>>n;int a[N];for(int i=1;i<=n;i++)cin>>a[i];//正式開始quick_sort(a,1,n);for(int i=1;i<=n;i++)cout<<a[i]<<' ';return 0; }

歸并排序

本質是: 兩個有序數(shù)組的合并
時間復雜度 O(nlogn)

#include<bits/stdc++.h> using namespace std; //核心思想: //兩個有序數(shù)組的合并 //歸并排序,時間復雜度是O(nlogn),但是需要額外的內存 const int N=100005; int tmp[N]; void merge_sort(int q[], int l, int r) {if (l >= r) return;//先劃分為n個獨立的子序列 int mid = l + r >> 1;merge_sort(q, l, mid);merge_sort(q, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];else tmp[k ++ ] = q[j ++ ];while (i <= mid) tmp[k ++ ] = q[i ++ ];while (j <= r) tmp[k ++ ] = q[j ++ ];for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j]; } int main(){int n;cin>>n;int a[N];for(int i=1;i<=n;i++)cin>>a[i];merge_sort(a,1,n);for(int i=1;i<=n;i++)cout<<a[i]<<' ';return 0; }

堆排序

堆的本質就是一個完全二叉樹,只不過哦滿足特殊的要求


1. 大頂堆: 每一個 父節(jié)點 >= 子節(jié)點
2. 小頂堆: 每一個父節(jié)點 <= 子節(jié)點


根據(jù)這一特性,可以使用堆的性質來對元素進行排序


時間復雜度O(nlogn)

步驟:
1.從a[n/2] 到a[1] ,不斷調整,每個分支結點與其孩子的值,使其滿足大頂堆的性質
2.堆排序:
(1) 頭尾交換 堆的長度減1
(2) 把"新堆"調整為大頂堆
(3)循環(huán)以上兩步,直到只剩下對頂元素

//堆排序時間復雜度 O(nlogn) #include<bits/stdc++.h> using namespace std; const int N = 100005; int a[N]; void adjust_heap(int a[] , int i , int len){// n/2就是父節(jié)點的坐標 , i * 2 就指向子節(jié)點for( i = i * 2 ; i <= len ; i *= 2){//此時i指向左孩子if(i < len && a[i] < a[i+1])//右孩子大i ++ ;if(a[i] > a[i/2])//如果孩子 > 父節(jié)點,則交換swap(a[i], a[i/2]);else//父節(jié)點大于兩個子節(jié)點,則不需要交換 break; } } int main(){int n; cin >> n;for(int i = 1; i <= n; i ++) cin >> a[i] ;// 建 大頂堆, 必須從下向上 調整// [n/2] 為最后一個分支結點(父節(jié)點) for(int i = n/2;i >= 1; i--)adjust_heap(a,i,n) ;cout << endl;//堆排序 // 堆頂 的元素 肯定是最大的,每次把堆頂?shù)闹捣抛詈? for(int i = n; i >= 2; i--){swap(a[1],a[i]);// 最大值已經(jīng)到了最后 adjust_heap(a,1,i-1);//調整剩余n-1個 } // 輸出for(int i = 1; i <= n; i++) cout << a[i] << ' '; }

我們常用的 priority_queue的底層實現(xiàn)就是堆,因此可以使用priority_queue來模擬堆排序,但是效率較數(shù)組模擬較差

總結

以上是生活随笔為你收集整理的纯手打常见基础排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。