最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++九種排序具體實(shí)現(xiàn)代碼

 更新時(shí)間:2020年04月09日 10:21:47   作者:DX3906  
這篇文章主要介紹了C++九種排序具體實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文內(nèi)容會(huì)根據(jù)博主所需進(jìn)行更新,希望大家多多關(guān)照。

直接插入排序

void InsertSort(int r[])
{
 int n = sizeof(r) / sizeof(r[0]);
 for(int i = 1; i < n; ++i)
 {
  for(int j = i - 1; j >= 0; --j)
  {   
   if(r[j+1] < r[j])
   {
    int s = r[j+1];
    r[j+1] = r[j];
    r[j] = s;
   }
  }
 }
}

折半插入排序

void BinInsertSort(int r[])
{
 int n = sizeof(r) / sizeof(r[0]);
 for(int i = 1; i < n; ++i)
 {
  int s = r[i];
  int low = 0;
  int high = i - 1;
  
  while(low <= high)
  {
   int mid = (low + high) / 2; //mid位置為要找的數(shù)
   if(s < r[mid])
    high = mid - 1;
   else
    low = mid + 1;
  }
  
  for(int j = i - 1; j >= high + 1; --j) //high+1即mid,執(zhí)行數(shù)的后移,直到mid的數(shù)后移
   r[j+1] = r[j];
  
  r[high+1] = s; //mid位置就存放本身
 }
}

希爾排序

void ShellSort(int r[])
{
 int n = sizeof(r) / sizeof(r[0]);
 int step = n / 2;
 
 while(step >= 1)
 {
  for(int i = step; i < n; ++i)
  {
   for(int j = i - step; j >= 0; j -= step)
   {    
    if(r[j+step] < r[j])
    {
     int s = r[j+step];
     r[j+step] = r[j];
     r[j] = s;
    }
   }
  }
  step /= 2;
 }
}

直接選擇排序

void SelectSort(int r[])
{
 int n = sizeof(r) / sizeof(r[0]);
 for(int i = 0; i < n - 1; ++i)
 {
  int samll = i;
  for(int j = i + 1; j < n; ++j)
  {
   if(r[small] > r[j])
    samll = j;
  }
  if(small != i)
  {
   int s = r[i];
   r[i] = r[small];
   r[small] = s;
  }
 }
}

堆排序

void HeapAdjust(int r[]; int i; int j) //調(diào)整堆
{
 int child = 2 * i;
 int s = r[i]; //s臨時(shí)存放結(jié)點(diǎn)數(shù)據(jù)
 while(child <= j)
 {
  if(child < j && r[child+1] > r[child]) //比較2個(gè)子樹
   ++child;
  if(s >= r[child]) //結(jié)點(diǎn)與大子樹比較
   break;
  r[child/2] = r[child]; //如果大子樹比結(jié)點(diǎn)大,互換
  child = 2 * child; //繼續(xù)向子樹檢索
 }
 r[child/2] = s; //結(jié)點(diǎn)的數(shù)為最大的數(shù)
}

void HeapSort(int r[]) //建堆
{
 int n = sizeof(r) / sizeof(r[0]);
 for(int i = n / 2 - 1; i >= 0; --i) //只有n/2-1前的下標(biāo)才有子樹
 {
  HeapAdjust(r, i, n - 1); //構(gòu)造大頂堆,結(jié)點(diǎn)都比子樹大,最后根節(jié)點(diǎn)為最大的數(shù)
 }
 for(int i = n - 1; i > 0; --i)
 {
  //將當(dāng)前堆頂元素與當(dāng)前堆尾元素互換,即將最大的數(shù)移到末尾
  int s = r[0];
  r[0] = r[i];
  r[i] = s;
  HeapAdjust(r, 0, i -1); //將剩下的元素繼續(xù)調(diào)整,最后變成由小到大的順序
 }
}

冒泡排序

void BubbleSort(int r[])
{
 int n = sizeof(r) / sizeof(r[0]);
 for(int i = 0; i < n - 1; ++i)
 {
  for(int j = 0; j < n - 1 - i; ++j)
  {
   if(r[j] > r[j+1])
   {
    int s = r[j];
    r[j] = r[j+1];
    r[j+1] = s;
   }
  }
 }
}

快速排序

int Partition(int r[], int low, int high)
{
 int pivotkey = r[low];
 int i = low;
 int j = high;
 
 while(i < j)
 {
  while(i < j && r[j] > pivotkey) //從j往前找,找出第一個(gè)比pivotkey小的數(shù)
   --j;
  if(i < j)
  {
   r[i] = r[j];
   ++i;
  }
  
  while(i < j && r[i] < pivotkey) //從i往后找,找出第一個(gè)比pivotkey大的數(shù)
   ++i;
  if(i < j)
  {
   r[j] = r[i];
   --j;
  }
 }
 r[j] = pivotkey; //完成最終交換
 return j; //返回分界點(diǎn),前面的數(shù)都比pivotkey小,后面的數(shù)都比pivokey大
}

void QuickSort(int r[], int low, int high) // 傳數(shù)組、0和長(zhǎng)度-1
{
 if(low < high)
 {
  int pivot = Partition(r, low, high);
  QuickSort(r, low, pivot - 1); //遞歸,前半部分繼續(xù)進(jìn)行快速排序
  QuickSort(r, pivot + 1; high); //遞歸,后半部分繼續(xù)進(jìn)行快速排序
 }
}

歸并排序

void copyArray(int source[], int dest[], int len, int first)
{
  int i;
  int j = first;
  for(i = 0; i < len; ++i)
  {
    dest[j] = source[i];
    ++j;
  }
}

void merge(int a[], int left, int right)
{
  int begin1 = left;
  int mid = (left + right) / 2;
  int begin2 = mid + 1;
  int newArrayLen = right - left + 1;
  int *b = (int*)malloc(newArrayLen * sizeof(int));
  int k = 0;
  
  while(begin1 <= mid && begin2 <= right) //找出2組中比較后小的那個(gè)數(shù)按順序放進(jìn)b空間
  {
    if(a[begin1] <= a[begin2])
      b[k++] = a[begin1++];
    else
      b[k++] = a[begin2++];
  }
  
  //把剩下的數(shù)放進(jìn)b空間
  while(begin1 <= mid)
    b[k++] = a[begin1++];
  while(begin2 <= right)
    b[k++] = a[begin2++];
  
  copyArray(b, a, newArrayLen, left); //把b空間的數(shù)寫回原數(shù)組
  free(b);
}

void MergeSort(int r[], int left, int right) //傳數(shù)組、0和長(zhǎng)度-1
{
  int i;
  //至少有兩個(gè)元素才進(jìn)行排序
  if(left < right)
  {
    i = (left + right) / 2;
    MergeSort(r, left, i); //前半部分遞歸
    MergeSort(r, i + 1, right); //后半部分遞歸    
    merge(r, left, right); //10個(gè)數(shù)的比較順序?yàn)閇0,1][0,2][3,4][0,4][5,6][5,7][8,9][5,9][0,9]
  }
}

桶排序

void insert(list<int> &bucket, int val)
{
  auto iter = bucket.begin();
  while(iter != bucket.end() && val >= *iter)
    ++iter;
  //insert會(huì)在iter之前插入數(shù)據(jù),這樣可以穩(wěn)定排序
  bucket.insert(iter, val);
}

void BuckdeSort(vector<int> &arr)
{
  int len = arr.size();
  if(len <= 1)
    return;
  int min = arr[0], max = min;
  for(int i = 1; i < len; ++i) //找出最小值和最大值
  {
    if(min > arr[i])
      min = arr[i];
    if(max < arr[i])
      max = arr[i];
  }
  
  int k = 10; //桶的大小
  
  //向上取整,例如[0,9]有10個(gè)數(shù),就有(9-0)/k+1=1個(gè)桶
  int bucketsNum = (max - min) / k + 1; //桶的個(gè)數(shù)
  
  vector<list<int>> buckets(bucketsNum);
  for(int i = 0; i < len; ++i)
  {
    int value = arr[i];
    //(value-min)/k就是在哪個(gè)桶里面
    insert(buckets[(value-min)/k], value); //將數(shù)據(jù)放到各個(gè)桶里并排序
  }
  
  int index = 0;
  for(int i = 0; i < bucketsNum; ++i)
  {
    if(buckets[i].size())
    {
      for(auto &value : buckets[i])
        arr[index++] = value;
    }
  }
}

到此這篇關(guān)于C++九種排序具體實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)C++ 排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 通過“回文字算法”復(fù)習(xí)C++語言

    通過“回文字算法”復(fù)習(xí)C++語言

    這篇文章主要介紹了通過“回文字算法”復(fù)習(xí)C++語言的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • C++實(shí)現(xiàn)酒店管理系統(tǒng)

    C++實(shí)現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • c++實(shí)現(xiàn)簡(jiǎn)單的線程池

    c++實(shí)現(xiàn)簡(jiǎn)單的線程池

    這里給大家介紹了C++中對(duì)于pthread線程的一個(gè)簡(jiǎn)單應(yīng)用以及使用繼承CDoit,實(shí)現(xiàn)其中的start和end,有需要的小伙伴可以參考下
    2015-11-11
  • C語言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)

    C語言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)

    數(shù)組可以幫我們巧妙解決生活中的問題,使我們的代碼簡(jiǎn)潔,本文主要介紹了C語言中的一維數(shù)組與二維數(shù)組,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • C++可調(diào)用對(duì)象callable object深入分析

    C++可調(diào)用對(duì)象callable object深入分析

    所謂的callable object,表示可以被某種方式調(diào)用其某些函數(shù)的對(duì)象。它可以是:一個(gè)函數(shù)、一個(gè)指向成員函數(shù)的指針、一個(gè)函數(shù)對(duì)象,該對(duì)象擁有operator()、一個(gè)lambda表達(dá)式,嚴(yán)格的說它是一種函數(shù)對(duì)象
    2022-08-08
  • 進(jìn)程間通信之深入消息隊(duì)列的詳解

    進(jìn)程間通信之深入消息隊(duì)列的詳解

    本篇文章是對(duì)消息隊(duì)列的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)按行讀寫文件

    C語言實(shí)現(xiàn)按行讀寫文件

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)按行讀寫文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C字符串與C++字符串的深入理解

    C字符串與C++字符串的深入理解

    本篇文章是對(duì)C字符串與C++字符串進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)鼠標(biāo)控制的黑框象棋

    C++實(shí)現(xiàn)鼠標(biāo)控制的黑框象棋

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)鼠標(biāo)控制的黑框象棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論

东山县| 昌黎县| 元江| 吉林省| 潜山县| 汉阴县| 平谷区| 二连浩特市| 鲁甸县| 阿克| 苗栗县| 德格县| 新余市| 紫阳县| 永泰县| 玉树县| 华阴市| 沅江市| 绥阳县| 肇源县| 山丹县| 弋阳县| 莒南县| 民乐县| 和平县| 响水县| 邮箱| 萨嘎县| 清远市| 邯郸市| 郑州市| 延寿县| 东城区| 呼和浩特市| 桐梓县| 南溪县| 南城县| 正阳县| 同德县| 正蓝旗| 巧家县|