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

7種排序算法的實現(xiàn)示例

 更新時間:2014年05月06日 09:15:56   作者:  
這篇文章主要介紹了7種排序算法的實現(xiàn)示例,需要的朋友可以參考下

復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void BubbleSort1 (int n, int *array) /*little > big*/
{
 int i, j;
 for (i=0; i<n-1; i++)
 {
  for (j=n-1; j>i; j--)
  {
   if (array[j] < array[j-1])
   {
    int temp = array[j];
    array[j] = array[j-1];
    array[j-1] = temp;
   }
  }
 }
}

void BubbleSort2 (int n, int *array)
{
 int i, j, flag=1; /*flag=1表示需要繼續(xù)冒泡*/
 for (i=0; i<n-1 && flag; i++)
 {
  flag = 0;
  for (j=n-1; j>i; j--)
  {
   if (array[j] < array[j-1])
   {
    int temp = array[j];
    array[j] = array[j-1];
    array[j-1] = temp;
    flag = 1;
   }
  }
 }
}

void SelectSort (int n, int *array)
{
 int i, j, min;
 for (i=0; i<n-1; i++)
 {
  min = i;
  for (j=i+1; j<n; j++)
  {
   if (array[min] > array[j])
    min = j;
  }
  int temp = array[min];
  array[min] = array[i];
  array[i] = temp;
 }
}

void InsertSort (int n, int*array)
{
 int i, j;
 for (i=1; i<n; i++)
 {
  if (array[i] < array[i-1]) /*是否需要插入*/
  {
   int key = array[i]; //哨兵
   for (j = i-1;j>=0 && array[j] > key; j--)
   {
    array[j+1] = array[j];
   }
   /*循環(huán)結束時array[j]<=key,將key插入到j+1處*/
   array[j+1] = key;
  }
 }
}

/*分組插入排序*/
void ShellSort (int n, int *array)
{
 int i, j;
 int increment;
 for (increment=n/2; increment > 0; increment /= 2)
 {
  for (i=0; i<increment; i++)  /*下面對一組序列進行插入排序*/
  {
   for (j=i+increment; j<n; j+=increment)
   {
    if (array[j] < array[j-increment])
    {
     int key = array[j];
     int k;
     for (k=j-increment; k>=0 && array[k]>key; k -= increment)
     {
      array[k+increment] = array[k];
     }
     array[k+increment] = key;
    }
   }
  }
 }
}

/*分治法*/
void QuickSort (int left, int right, int *array)
{
 if(left>=right)
  return ;
 int i=left, j=right;
 int key=array[i];
 while (i<j)
 {
  while (i<j && array[j]>=key)
   j--;
  array[i] = array[j];
  while (i<j && array[i]<=key)
   i++;
  array[j] = array[i];
 }
 array[i] = key;
 QuickSort(left, i-1, array);
 QuickSort(i+1, right, array);
}

/*array[start+1] ~ array[end]已經(jīng)滿足堆的定義,調整使得array[start] ~ array[end]滿足堆定義*/
void HeapAdjust (int start, int end, int array[])
{
 int i;
 int temp = array[start]; /*產生第一個空白*/
 for (i=2*start+1; i<=end; i=2*i+1)  /*每次循環(huán)時空白節(jié)點為array[(i-1)/2]*/
 {
  if (i<end && array[i] < array[i+1])  /*在左右孩子中尋找較大值*/
   i++;
  if (array[i] > temp)
   array[(i-1)/2] = array[i];
  else
   break;
 }
 array[(i-1)/2] = temp;  /*插入原來的temp到空白處*/
}
void HeapSort (int n, int array[])
{
 int i;
 for (i=(n-2)/2; i>=0; i--)  /*構造大頂堆*/
  HeapAdjust(i, n-1, array);

 for (i=n-1; i>0; i--)
 {
  int t = array[i]; /*將根節(jié)點交換到數(shù)組末端*/
  array[i] = array[0];
  array[0] = t;

  HeapAdjust(0, i-1, array); /*重新調整堆*/
 }
}

/*array[s…m]和array[m+1…t]均已各自有序,合并使得array[s…t]有序*/
void Merge(int s, int m, int t, int *array)
{
 int temp[t-s+1];
 int i=s, j=m+1, k=0;
 while(i<=m && j<=t)
 {
  if(array[i] < array[j])
   temp[k++] = array[i++];
  else
   temp[k++] = array[j++];
 }
 while(i<=m)
  temp[k++] = array[i++];
 while(j<=t)
  temp[k++] = array[j++];

 for(i=s, k=0; i<=t && k<=t-s; i++, k++)
 {
  array[i] = temp[k];
 }
}
void MSort (int s, int t, int *array) /*遞歸調用*/
{
 if(s == t)
  return ;
 int m = (s+t)/2;
 MSort(s, m, array);
 MSort(m+1, t, array);
 Merge(s, m, t, array);
}
void MergeSort1(int n, int *array)
{
 MSort(0, n-1, array);
}
void MergeSort2(int n, int *array) /*非遞歸實現(xiàn)歸并排序*/
{
 int k, i;
 for (k=1; 2*k<n; k *= 2) /*設置每段待歸并的有序序列的長度:1,2,4,8,16……*/
 {
  for (i=0; i+k-1<n; i += 2*k) /*考慮待歸并的左右兩段序列,[i+k-1]是左序列末尾元素下標*/
  {        /*[end=i+2*k-1]是右序列末尾元素下標,end不應該超過n-1*/
   int end=i+2*k-1;
   if(end > n-1)
    end = n-1;
   Merge(i, i+k-1, end, array);
  }
 }
}


int main()
{
 long start, stop;
 int n;
 printf("下面比較幾個時間復雜度為NlogN的排序算法效率高低,其他3個低效率的排序就不考慮了\n");
 printf("輸入待排序數(shù)量(int類型表示,在我的機器上超過100萬就可能溢出):\n");
 scanf("%d", &n);
 int a[n], i;

 for(i=0; i<n; i++)
  a[i] = rand()%n;
 start = clock();
 ShellSort(n, a);
 stop = clock();
 printf("希爾排序%d個數(shù)據(jù)花費時間為: %ldms\n", n, (stop-start)*1000/CLOCKS_PER_SEC);

 for(i=0; i<n; i++)
  a[i] = rand()%n;
 start = clock();
 HeapSort(n, a);
 stop = clock();
 printf("堆排序%d個數(shù)據(jù)花費時間為: %ldms\n", n, (stop-start)*1000/CLOCKS_PER_SEC);

 for(i=0; i<n; i++)
  a[i] = rand()%n;
 start = clock();
 MergeSort1(n, a);
 stop = clock();
 printf("遞歸式歸并排序%d個數(shù)據(jù)花費時間為: %ldms\n", n, (stop-start)*1000/CLOCKS_PER_SEC);

 for(i=0; i<n; i++)
  a[i] = rand()%n;
 start = clock();
 MergeSort2(n, a);
 stop = clock();
 printf("非遞歸式歸并排序%d個數(shù)據(jù)花費時間為: %ldms\n", n, (stop-start)*1000/CLOCKS_PER_SEC);

 for(i=0; i<n; i++)
  a[i] = rand()%n;
 start = clock();
 QuickSort(0, n-1, a);
 stop = clock();
 printf("快速排序%d個數(shù)據(jù)花費時間為: %ldms\n", n, (stop-start)*1000/CLOCKS_PER_SEC);

/* for(i=0; i<n; i++)
 {
  printf("%d ", a[i]);
 }
*/
 return 0;
}

相關文章

  • 基于Qt編寫簡易的視頻播放器

    基于Qt編寫簡易的視頻播放器

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)編寫簡易的視頻播放器,可以支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多種內核,感興趣的可以學習一下
    2022-12-12
  • C語言求解最長公共子字符串問題及相關的算法分析

    C語言求解最長公共子字符串問題及相關的算法分析

    最長公共子字符串問題即是求一個字符串在另一個字符串中出現(xiàn)的連續(xù)最多字符,這里我們來看一下面試中經(jīng)常出現(xiàn)的C語言求解最長公共子字符串問題及相關的算法分析
    2016-06-06
  • 深入解析C++設計模式編程中解釋器模式的運用

    深入解析C++設計模式編程中解釋器模式的運用

    這篇文章主要介紹了C++設計模式編程中解釋器模式的運用,解釋器模式給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子,需要的朋友可以參考下
    2016-03-03
  • C++鏈式二叉樹深入分析

    C++鏈式二叉樹深入分析

    二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。通常的方法是鏈表中每個結點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址
    2022-06-06
  • Windows下Qt打包自動尋找依賴的DLL

    Windows下Qt打包自動尋找依賴的DLL

    本文介紹了兩種在Windows下使用Qt打包應用程序并自動尋找依賴DLL的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • C/C++的內存管理你了解嘛

    C/C++的內存管理你了解嘛

    這篇文章主要為大家介紹了C/C++的內存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言實現(xiàn)掃雷游戲附注釋

    C語言實現(xiàn)掃雷游戲附注釋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲附注釋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • OpenSSL動態(tài)鏈接庫源碼安裝教程

    OpenSSL動態(tài)鏈接庫源碼安裝教程

    Openssl 是一個開放源代碼的SSL協(xié)議的產品實現(xiàn),它采用C語言作為開發(fā)語言,具備了跨系統(tǒng)的性能。這篇文章主要介紹了OpenSSL動態(tài)鏈接庫源碼安裝,需要的朋友可以參考下
    2021-11-11
  • C語言Iniparser庫實現(xiàn)ini文件讀寫

    C語言Iniparser庫實現(xiàn)ini文件讀寫

    iniparser是針對INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來介紹一下如何利用Iniparser庫實現(xiàn)ini文件讀寫吧
    2023-03-03
  • C++服務器和客戶端交互的項目實踐

    C++服務器和客戶端交互的項目實踐

    本文主要介紹了C++服務器和客戶端交互的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論

桦川县| 温宿县| 紫金县| 上虞市| 曲靖市| 二连浩特市| 凤阳县| 新乡县| 信丰县| 扎鲁特旗| 武定县| 海南省| 桐柏县| 抚顺市| 克拉玛依市| 赤城县| 天全县| 海淀区| 资源县| 柏乡县| 遵化市| 德庆县| 凤阳县| 莲花县| 东乡族自治县| 集安市| 兴海县| 托克逊县| 大田县| 进贤县| 平安县| 嘉黎县| 景泰县| 扶绥县| 呼图壁县| 广西| 葫芦岛市| 怀化市| 张家界市| 武宣县| 泗阳县|