簡單排序集錦

部分轉(zhuǎn)載自CSDN博客 Morewindows Blog

冒泡排序--算法復(fù)雜度為O(n^2)

1.比較相鄰的前后二個數(shù)據(jù),如果前面數(shù)據(jù)大于后面的數(shù)據(jù),就將二個數(shù)據(jù)交換。
2.這樣對數(shù)組的第0個數(shù)據(jù)到N-1個數(shù)據(jù)進行一次遍歷后,最大的一個數(shù)據(jù)就“沉”到數(shù)組第N-1個位置透罢。
3.N=N-1,如果N不為0就重復(fù)前面二步冠蒋,否則排序完成羽圃。

void bubble1(int a[],int n)
{
    int tmp;
    for(int i=0;i<n;i++)
       for(int j=1;j<n-i;j++)
               if(a[j-1]>a[j]) { tmp=a[j-1];a[j-1]=a[j];a[j]=tmp;}
}

問題1:有可能排序已經(jīng)完成,但仍然做了很多次比較..明顯浊服,如果又一次兩兩之間都沒有發(fā)生交換统屈,那么就是排序已經(jīng)完成..

void bubble2(int a[],int n)
{
       int tmp,k=n;
       bool flag=true;
       while(flag)
      {
            flag=false;
            for(int j=1;j<k;j++)
                if(a[j-1]>a[j])
               {
                    tmp=a[j-1];a[j-1]=a[j];a[j]=tmp; 
                    flag=true;
               }
            k--;
      }
}

問題2:再進一步考慮,如果數(shù)組只有前面一部分是無序的牙躺,后面都是有序的,那么要記錄下最后一個無序(最后一次交換發(fā)生)的位置腕扶,下一次后面的序列不用再比較..

void bubble3(int a[], int n)
{
     int tmp,flag=n;
     int j,k;
     while(flag)
     {
           k=flag;
           flag=0;
           for(j=1;j<k;j++)
               if(a[j-1]>a[j]) 
                 {    tmp=a[j-1];a[j-1]=a[j];a[j]=tmp;
                      flag=j;
                 }
     }
}

直接插入排序 --算法復(fù)雜度 O(n^2)

直接插入排序(InsertionSort)的基本思想是:每次將一個待排序的記錄孽拷,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當位置,直到全部記錄插入完成為止半抱。

  1.  初始時脓恕,a[0]自成1個有序區(qū)膜宋,無序區(qū)為a[1..n-1]。令i=1
    
  1.  將a[i]并入當前的有序區(qū)a[0…i-1]中形成a[0…i]的有序區(qū)間炼幔。
    
  2.  i++并重復(fù)第二步直到i==n-1秋茫。排序完成。
    
void Insertsort1(int a[], int n)
{
    int i, j, k;
    for (i = 1; i < n; i++)
    {
        //為a[i]在前面的a[0...i-1]有序區(qū)間中找一個合適的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;

        //如找到了一個合適的位置
        if (j != i - 1)
        {
            //將比a[i]大的數(shù)據(jù)向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //將a[i]放到正確位置上
            a[k + 1] = temp;
        }
    }
}

更簡單的寫上述插入排序乃秀,把找到合適的位置和數(shù)據(jù)移動結(jié)合起來

void Insertsort2(int a[], int n)
{
    int i, j;
    for (i = 1; i < n; i++)
        if (a[i] < a[i - 1])//否則說明a[i]可以直接加入到序列末尾
        {
            int temp = a[i];
            for (j = i - 1; j >= 0 && a[j] > temp; j--)
                a[j + 1] = a[j];
            a[j + 1] = temp;
        }
}

還可以用數(shù)據(jù)交換代替數(shù)據(jù)后移肛著,這樣代碼更簡潔

void Insertsort3(int a[], int n)
{
    int i, j;
    for (i = 1; i < n; i++)
        for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
            Swap(a[j], a[j + 1]);
}

選擇排序--算法復(fù)雜度 O(n^2)

選擇排序和插入排序類似,都將數(shù)據(jù)分為有序區(qū)和無序區(qū)跺讯,所不同的是插入排序是將無序區(qū)的第一個元素直接插入到有序區(qū)以形成一個更大的有序區(qū)枢贿,而選擇排序是從無序區(qū)選一個最小的元素直接放到有序區(qū)的最后。

每一次找到無序區(qū)內(nèi)的最小值賦給a[i]
注意swap的用法刀脏,如果用位操作局荚,要注意判斷a!=b是否成立,如果沒有這一句愈污,會出現(xiàn)數(shù)字清零..

#include <stdio.h>
void swap1(int &a, int &b)
{
    if(a!=b)
    {
        a = a^b;
        b = a^b;
        a = a^b;
    }
}

void swap2(int &a, int &b)
{
    int tmp;
    tmp = a; a=b; b=tmp;
}


void mysort(int a[],int n)
{
    int i,j,minIndex;
    for(i=0;i<n;i++)
    {
      minIndex = i;
      for(j=i+1;j<n;j++)
          if(a[minIndex]>a[j]) minIndex = j;
      swap2(a[i],a[minIndex]);
    }
}

int main()
{
    int a[10]={6,4,5,2,3,8,1,7,9,10};
    mysort(a,10);
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}





1.6174問題

輸入一個整數(shù)比如1234耀态,互相交換各位數(shù)字,并且以大到小排列暂雹,以小到大排列首装,求出兩個排列之差作為下一個數(shù)字..
數(shù)字轉(zhuǎn)存成字符串,選擇排序找到從小到大的排列..

#include<stdio.h>
#include<string.h>
int num[2000],count;
int get_next(int x)
{
    int a,b,n;
    char tmp;
    char s[10];
    sprintf(s,"%d",x);//數(shù)字轉(zhuǎn)化為字符串
    n=strlen(s);

    for(int i=0;i<n;i++)//選擇排序得到從小到大的b
        for(int j=i+1;j<n;j++)
            if(s[i]>s[j])  {tmp=s[i];s[i]=s[j];s[j]=tmp;}
    sscanf(s,"%d",&b);

    for(i=0;i<n/2;i++)//字符串反轉(zhuǎn)得到a
    {
        tmp=s[i];s[i]=s[n-1-i];s[n-1-i]=tmp;
    }
    sscanf(s,"%d",&a);
    return a-b;
}

int main()
{    
  scanf("%d",&num[0]);
  printf("%d",num[0]);
  count=1;
  for(;;)
  {
      num[count]=get_next(num[count-1]);
      printf("-> %d",num[count]);
      int found=0;//在數(shù)組num中尋找新生成的數(shù)
      for(int i=0;i<count;i++)
          if(num[i] == num[count])  {found=1;break;}
      if(found) break;
      count++;
  }
  printf("\n");
  return 0;
}

2.字母重排問題

輸入了所有單詞擎析,可以對所有單詞進行排序簿盅,這時用到的是cmp_string..之后進行每個單詞的排序,首先放到另外一個數(shù)組內(nèi)揍魂,對每個數(shù)組排序..

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
char word[2000][10],sorted[2000][10];

int cmp_char(const void* _a, const void* _b)
{
    char* a=(char*) _a;
    char* b=(char*) _b;
    return *a - *b;//從小到大排列,返回要求a>b返回1,a<b返回0.
}

int cmp_string(const void* _a, const void* _b)
{
    char* a=(char*) _a;
    char* b=(char*) _b;
    return strcmp(a,b);//從小到大排列,返回要求a>b返回1,a<b返回-1.
}
 
int main()
{    
  n=0;
  for(;;)
  {
      scanf("%s",word[n]);
      if(word[n][0]=='*') break;
      n++;
  }
  qsort(word,n,sizeof(word[0]),cmp_string);//給所有單詞排序
  for(int i=0;i<n;i++)//給每個單詞排序
  {
      strcpy(sorted[i],word[i]);
      qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);
  }

  char s[10];
  while(scanf("%s",s)==1)
  {
      qsort(s,strlen(s),sizeof(char),cmp_char);
      int found=0;
      for(int i=0;i<n;i++)
          if(strcmp(sorted[i],s)==0)
          {
              found=1;
              printf("%s",word[i]);//在字典里找到了
          }
      if(!found) printf(":(");
      printf("\n");
  }
  return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桨醋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子现斋,更是在濱河造成了極大的恐慌喜最,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庄蹋,死亡現(xiàn)場離奇詭異瞬内,居然都是意外死亡,警方通過查閱死者的電腦和手機限书,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門虫蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倦西,你說我怎么就攤上這事能真。” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵粉铐,是天一觀的道長疼约。 經(jīng)常有香客問我,道長蝙泼,這世上最難降的妖魔是什么程剥? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮汤踏,結(jié)果婚禮上织鲸,老公的妹妹穿的比我還像新娘。我一直安慰自己茎活,他們只是感情好昙沦,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著载荔,像睡著了一般盾饮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懒熙,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天丘损,我揣著相機與錄音,去河邊找鬼工扎。 笑死徘钥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肢娘。 我是一名探鬼主播呈础,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橱健!你這毒婦竟也來了而钞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拘荡,失蹤者是張志新(化名)和其女友劉穎臼节,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珊皿,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡网缝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟋定。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粉臊。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驶兜,靈堂內(nèi)的尸體忽然破棺而出维费,到底是詐尸還是另有隱情果元,我是刑警寧澤促王,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布犀盟,位于F島的核電站,受9級特大地震影響蝇狼,放射性物質(zhì)發(fā)生泄漏阅畴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一迅耘、第九天 我趴在偏房一處隱蔽的房頂上張望贱枣。 院中可真熱鬧,春花似錦颤专、人聲如沸纽哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽春塌。三九已至,卻和暖如春簇捍,著一層夾襖步出監(jiān)牢的瞬間只壳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工暑塑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吼句,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓事格,卻偏偏與公主長得像惕艳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驹愚,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述:排序有內(nèi)部排序和外部排序远搪,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大么鹤,一次不能容納全部...
    每天刷兩次牙閱讀 3,732評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序终娃,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大蒸甜,一次不能容納全部...
    蟻前閱讀 5,184評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,253評論 0 2
  • S城的天氣著實讓人琢磨不透棠耕,忽冷忽熱,人們一直脫衣服穿衣服脫衣服穿衣服柠新,好多人都感冒了窍荧,有嚴重的甚至都去輸液了,林...
    007008閱讀 291評論 2 3
  • 焦慮 你焦慮嗎恨憎?焦慮就對了蕊退。 我們生活在一個信息大爆炸的年代里郊楣,在這個年代里幾乎每個人都想利用知識改變自己的命運,...
    我以前是學(xué)渣閱讀 293評論 2 2