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

常用排序算法整理分享(快速排序算法、希爾排序)

 更新時(shí)間:2014年03月17日 11:36:47   作者:  
這篇文章主要介紹了一些常用排序算法整理,插入排序算法、直接插入排序、希爾排序、選擇排序、冒泡排序等排序,需要的朋友可以參考下

整理了幾個(gè)排序算法,通過(guò)測(cè)試來(lái)看,最快的還是快速排序算法,簡(jiǎn)直不是一個(gè)數(shù)量級(jí)的速度。

復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <unistd.h>

//一些排序算法整理
//插入排序算法
//直接插入排序
void
direct_insert_sort(int *a,int len)
{
 //思路:最后一個(gè)依次和前面的進(jìn)行比較
 //將滿足的條件的往后移動(dòng),當(dāng)然是從頭
 //開(kāi)始且是從最小比較數(shù)組開(kāi)始逐漸擴(kuò)大
 //到整個(gè)數(shù)組
 int i,j,temp;
 for(i = 1;i < len;++i) {
  //獲取最后一個(gè)索引數(shù)據(jù)
  temp = a[i];
  for(j = i - 1;j >= 0;--j) {
   //從倒數(shù)第二個(gè)開(kāi)始
   if(a[j] > temp)//升序排列
    a[j + 1] = a[j];
   else
    break;//立刻退出
  }
  //將最后一個(gè)位置插入到合適的位置
  a[j + 1] = temp;
 }
}

//希爾排序
void
shell_insert_sort(int *a,int len)
{
 //思路:就是比直接插入排序多了層
 //循環(huán),這層循環(huán)是用來(lái)控制步進(jìn)按
 //照算法的本來(lái)思路是這樣可以減少
 //交換次數(shù)
 int i,j,h,temp;
 for(h = len / 2;h > 0;h /= 2) {
  //內(nèi)層其實(shí)本質(zhì)還是直接插入
  //算法思路
  //注意下i += h和i++兩者對(duì)算
  //法的影響
  for(i = h;i < len;i += h) {
   //獲取最后一個(gè)索引的值
   temp = a[i];
   for(j = i - h;j >= 0;j -= h) {
    if(a[j] > temp)//升序排列
     a[j + h] = a[j];
    else
     break;
   }
   //將找到的位置插入最后一個(gè)索引
   a[j + h] = temp;
  }
 }
}

//選擇排序
//冒泡排序
void
bubble_swap_sort(int *a,int len)
{
 //思路:從數(shù)組最后開(kāi)始兩兩比較
 //將底層滿足要求的數(shù)據(jù)逐漸交換
 //到上層,可能導(dǎo)致交換次數(shù)太多
 int i,j,temp;
 //如果一次冒泡中沒(méi)有發(fā)生交換可
 //以認(rèn)為此次排列已經(jīng)結(jié)束
 bool exchange = false;
 for(i = 0;i < len - 1;++i) {
  for(j = len - 1;j > i;--j) {
   //滿足條件的就進(jìn)行交換
   if(a[j] < a[j - 1]) {
    temp = a[j];
    a[j] = a[j - 1];
    a[j - 1] = temp;
    exchange = true;
   }
  }
  if(exchange)
   exchange = false;
  else
   break;
 }
}

//快速排序
void
quick_swap_sort(int *a,int low,int high)
{
 //思路:從數(shù)組中找一個(gè)值
 //然后排列數(shù)組使其兩邊要
 //么大于要么小于這個(gè)值,
 //然后遞歸下去排序
 //優(yōu)勢(shì)在于每次找中間值可
 //以交換很多次。
 int _low,_high,qivot;
 if(low < high) {
  _low = low;
  _high = high;
  //這里從最后一個(gè)開(kāi)始
  qivot = a[low];
  //找中間值的辦法就是逐漸逼近
  //從頭尾兩端開(kāi)始逼近,順便也
  //排序了
  while(_low < _high) {
   //既然是從low開(kāi)始,那么首先
   //就從high找小于qivot的(升
   //序排列)
   while(_low < _high && a[_high] > qivot)
    --_high;//逐漸向中間逼近
   if(_low < _high)//必然是找到了a[_high] > qivot的情況
    a[_low++] = a[_high];
   //這下a[_high]空出位置來(lái)了,所以從low找
   //比qivot大的數(shù)據(jù)
   while(_low < _high && a[_low] < qivot)
    --_low;//逼近中間
   if(_low < _high)
    a[_high--] = a[_low];
  }
  //最后_low == _high那么這個(gè)位置就是qivot的位置
  a[_low] = qivot;
  //遞歸下去
  quick_swap_sort(a,low,_high - 1);
  quick_swap_sort(a,_low + 1,high);
 }
}

//選擇排序
//直接選擇排序
void
direct_select_sort(int *a,int len)
{
 //思路:就是遍歷數(shù)組找到極值
 //放到頭或者尾,這樣逐漸縮小
 //范圍到最小比較數(shù)組
 int i,j,pos,temp;
 for(i = 0;i < len - 1;++i) {
  //從頭開(kāi)始獲取一個(gè)值假設(shè)為極值
  pos = i;
  for(j = i + 1;j < len;++j) {
   //滿足條件
   if(a[pos] > a[j])//升序
    pos = j;
  }
  if(pos != i) {
   //進(jìn)行交換
   temp = a[pos];
   a[pos] = a[i];
   a[i] = temp;
  }
 }
}

void
disp(int *a,int len)
{
 int i = 0;
 for(;i < len;i++) {
  if(i != 0 && i % 16 == 0)
   printf("\n");
  printf(" %d",a[i]);
 }
 printf("\n");
}

#define TEST_ARRAY_LEN 100000
#define TEST_COUNT 1

int
main(int argc,char *argv[])
{
 //int a[] = {1,8,4,0,9,6,3,7,2,18,74,5,64,12,39};
 //int len = sizeof(a) / sizeof(a[0]);
 //direct_insert_sort(a,len);
 //shell_insert_sort(a,len);
 //bubble_swap_sort(a,len);
 //quick_swap_sort(a,0,len - 1);
 //direct_select_sort(a,len);
 disp(a,len);

 return 0;
}

相關(guān)文章

  • 詳細(xì)分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象

    詳細(xì)分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象

    這篇文章主要介紹了C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C語(yǔ)言中的指針新手初階指南

    C語(yǔ)言中的指針新手初階指南

    指針是C語(yǔ)言的靈魂,精華之所在,指針強(qiáng)大而危險(xiǎn),用得好是一大利器,用得不好是一大潛在危害,下面這篇文章主要給大家介紹了C語(yǔ)言中指針的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • SQL Server中的數(shù)據(jù)復(fù)制到的Access中的函數(shù)

    SQL Server中的數(shù)據(jù)復(fù)制到的Access中的函數(shù)

    SQL Server中的數(shù)據(jù)復(fù)制到的Access中,表的結(jié)構(gòu)相同 不要提用openrowset,因?yàn)锳ccess文件和SQL Server不在一臺(tái)機(jī)器上
    2008-11-11
  • C++實(shí)現(xiàn)聊天小程序

    C++實(shí)現(xiàn)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用

    C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用

    C語(yǔ)言中鏈接屬性決定如何處理在不同文件中出現(xiàn)的標(biāo)示符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié)

    C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié)

    這篇文章主要介紹了C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié),包括正切和反正切以及雙曲線正切等的函數(shù),需要的朋友可以參考下
    2015-08-08
  • 基于linux下獲取時(shí)間函數(shù)的詳解

    基于linux下獲取時(shí)間函數(shù)的詳解

    本篇文章是對(duì)linux下獲取時(shí)間的函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法

    xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間

    詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間

    這篇文章主要介紹了詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • C++ Qt屬性系統(tǒng)詳細(xì)介紹

    C++ Qt屬性系統(tǒng)詳細(xì)介紹

    這篇文章主要介紹了C++ Qt屬性系統(tǒng)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評(píng)論

日喀则市| 班戈县| 许昌市| 宣武区| 大洼县| 金门县| 辰溪县| 阜康市| 林周县| 阜阳市| 长宁县| 会昌县| 会东县| 滨州市| 桂东县| 仁寿县| 敦化市| 南涧| 越西县| 邹城市| 永靖县| 新巴尔虎左旗| 平罗县| 延川县| 会泽县| 威海市| 溧阳市| 南丹县| 平定县| 遂平县| 昭觉县| 松桃| 邮箱| 云和县| 徐闻县| 吴忠市| 海城市| 泰州市| 洛阳市| 青海省| 同仁县|