亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言中數(shù)組排序淺析

 更新時(shí)間:2022年12月13日 16:58:11   作者:wsbydmm  
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組元素排序的四種類型,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下

前言

本文介紹了幾種c語(yǔ)言中對(duì)亂序數(shù)組的排序方式。

具體的內(nèi)容有:

  • 插入排序;
  • 冒泡排序;
  • 選擇排序;
  • 希爾排序;

具體內(nèi)容詳見(jiàn)下文。

一、插入排序

1、思路

首先假設(shè)數(shù)組的的前n位元素是有序的,然后從第n+1位開(kāi)始,將此元素插入到前面,使得前n+1位元素有序,以此類推,直至整個(gè)數(shù)組有序。

在對(duì)第n+1位元素操作時(shí),使用臨時(shí)變量存放該元素的值,從第n位元素開(kāi)始向前比較,同時(shí)將與其比較的元素向后移動(dòng),直到與其比較的元素比其小時(shí),將臨時(shí)變量中的值放入該元素后的一個(gè)數(shù)組元素中。

2、具體步驟

1.從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序。

2.取下一個(gè)元素存入臨時(shí)變量temp,對(duì)前方有序序列從后往前掃描。

3.如果該元素大于temp,則將該元素移到下一位。

4.重復(fù)步驟3,直到找到已于等于temp的元素。

5.temp插入到該元素的后面一位,如果所有有序元素都大于temp,則將temp插入到下標(biāo)為0的位置(既數(shù)組的首位,說(shuō)明該元素是目前最小的元素)。

6.重復(fù)以上的2~5步驟,直至操作完整個(gè)數(shù)組中的所有元素。

3、代碼實(shí)現(xiàn)

void insertsort(int arr[], int len)
{
	int j;
	for(j=0; j<len-1; j++)
	{
		int end=j;    //前end位為有序部分
		int temp=arr[j+1];    //臨時(shí)變量存放
		while(end>=0)
		{
			if(arr[end]>temp)    //將temp變量與前面一位元素比較
			{
				arr[end+1]=arr[end];    //將比temp變量大的元素向后移動(dòng)一位
				end--;    //繼續(xù)向前比較
			}
			else    //找到比temp變量小的元素
			{
				break;
			}
		}
		arr[end+1]=temp;    //將temp變量插入有序部分
	}
}

4、復(fù)雜度

時(shí)間復(fù)雜度: O(N)~O(N^2)

空間復(fù)雜度:O(1)

二、冒泡排序

1、思路

通過(guò)對(duì)數(shù)組內(nèi)相鄰元素的比較,使較大的元素向后移動(dòng),較小的元素向前移動(dòng),不斷循環(huán)此過(guò)程,直至整個(gè)數(shù)組有序。

當(dāng)?shù)趎次循環(huán)結(jié)束后,數(shù)組的最后n位為有序,所以每循環(huán)一次,就可以將循環(huán)的范圍(后界)向前減少一位元素。

2、具體步驟

1.將數(shù)組中的第一個(gè)元素與下一個(gè)元素進(jìn)行比較,若第一個(gè)元素較大,則交換位置。

2.繼續(xù)比較下兩個(gè)元素的大小,將較大的元素放在靠后的位置。

3.重復(fù)步驟2,直至完成第n-1個(gè)元素與第n個(gè)元素的比較。

4.將循環(huán)的后界減一,重復(fù)1~5步驟。

5.當(dāng)循環(huán)的范圍減為1時(shí),此時(shí)的為有序數(shù)組。

3、代碼實(shí)現(xiàn)

void bubblesort(int arr[], int len)
{
	int j,k;    //定義循環(huán)因子,嵌套雙層循環(huán)
	for(j=0; j<len-1; j++)    //設(shè)置循環(huán)后界
	{
		for(k=0; k<len-j-1; k++)    //不斷向后進(jìn)行比較
		{
			if(arr[k]>arr[k+1])    //比較相鄰的元素
			{
				int temp=arr[k];    //三杯水交換法
				arr[k]=arr[k+1];
				arr[k+1]=temp;
			}
		}
	}
}

4、復(fù)雜度

時(shí)間復(fù)雜度: O(N)~O(N^2)

空間復(fù)雜度: O(1)

三、選擇排序

1、思路

不斷掃描數(shù)組,每次選出一個(gè)最小值和一個(gè)最大值,分別放在序列的首位置和末位置,然后將序列的首位置與末位置分別向后與前移動(dòng)一位。直至排完整個(gè)數(shù)組。

2、具體步驟

1.定義序列的首末位置。

2.掃描首末位置之間的序列,選出一個(gè)最小值min和一個(gè)最大值max,記錄下標(biāo)值。

3.將最小值放入首位置start,最大值放入末位置end。

4.將首位置向后移動(dòng)一位,末位置向前移動(dòng)一位。

5.重復(fù)2~4步驟,直至首末位置重合(start>=end),此時(shí)的數(shù)組為有序數(shù)組。

3、代碼實(shí)現(xiàn)

void selectsort(int arr[], int len)
{
	int start=0, end=len-1;    //定義首末位置
	while(start<end)
	{
		int max=start;    
		int min=start;
		int j;
		for(j=start; j<=end; j++)    //掃描首末位置之間的序列
		{
			if (arr[j] < arr[min])    //選取最小值
			{
				min = j;    //記錄最小值的下標(biāo)
			}
			if (arr[j] > arr[max])    //選取最大值
			{
				max = j;    //記錄最大值的下標(biāo)
			}
		}
		int temp=arr[min];    //三杯水交換,將最小值放入首位置
		arr[min]=arr[start];
		arr[start]=temp;
		if (start == max)    //防止最大值在首位置被換走
		{
			max = min;
		}
		temp=arr[max];    //三杯水交換,將最大值放入末位置
		arr[max]=arr[end];
		arr[end]=temp;
		start++;    //首位置后移一位
		end--;    //末位置前移一位
	}
}

4、復(fù)雜度

時(shí)間復(fù)雜度: O(N^2)

空間復(fù)雜度: O(1)

四、希爾排序

1、思路

定義一個(gè)小于數(shù)組長(zhǎng)度增量,將整個(gè)數(shù)組中每隔一個(gè)增量的元素分為一組,對(duì)每組中的元素進(jìn)行插入排序,再將增量減小,之后重復(fù)以上過(guò)程,直至增量減小為1時(shí),對(duì)已經(jīng)進(jìn)行過(guò)預(yù)處理的數(shù)組進(jìn)行插入排序,達(dá)到減小復(fù)雜度的目的。

2、具體步驟

1.定義一個(gè)小于數(shù)組長(zhǎng)度的增量gap(通常為數(shù)組長(zhǎng)度的一半),將數(shù)組進(jìn)行分組。

2.對(duì)每組中的元素進(jìn)行插入排序的操作,使之有序。

3.減小增量gap(通常為減為一半),將數(shù)組再度細(xì)分。

4.重復(fù)2~3步驟,直至增量gap減小為1。

5.此時(shí)對(duì)整個(gè)數(shù)組再做插入排序操作,使整個(gè)數(shù)組有序。

3、代碼實(shí)現(xiàn)

void shellsort(int arr[], int len)
{
	int gap=len;    //定義增量
	while(gap>1)
	{
		gap=gap/2;    //將增量減小
		int j;
		for(j=0; j<len-gap; j++)    //將數(shù)組分組
		{
			int end=j;
			int temp=arr[end+gap];    //對(duì)每組元素進(jìn)行插入排序
			while(end>=0)
			{
				if(arr[end]>temp)
				{
					arr[gap+end]=arr[end];
					end-=gap;
				}
				else
				{
					break;
				}
			}
			arr[end+gap]=temp;
		}
	}
}

4、復(fù)雜度

時(shí)間復(fù)雜度: 平均 O(N^1.3)

空間復(fù)雜度: O(1)

具體使用

#include<stdio.h>
void insertsort(int arr[], int len)    //選擇排序
{
	int j;
	for(j=0; j<len-1; j++)
	{
		int end=j;
		int temp=arr[j+1];
		while(end>=0)
		{
			if(arr[end]>temp)
			{
				arr[end+1]=arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end+1]=temp;
	}
}
void bubblesort(int arr[], int len)    //冒泡排序
{
	int j,k;
	for(j=0; j<len-1; j++)
	{
		for(k=0; k<len-j-1; k++)
		{
			if(arr[k]>arr[k+1])
			{
				int temp=arr[k];
				arr[k]=arr[k+1];
				arr[k+1]=temp;
			}
		}
	}
}
void shellsort(int arr[], int len)    //希爾排序
{
	int gap=len;
	while(gap>1)
	{
		gap=gap/2;
		int j;
		for(j=0; j<len-gap; j++)
		{
			int end=j;
			int temp=arr[end+gap];
			while(end>=0)
			{
				if(arr[end]>temp)
				{
					arr[gap+end]=arr[end];
					end-=gap;
				}
				else
				{
					break;
				}
			}
			arr[end+gap]=temp;
		}
	}
}
void selectsort(int arr[], int len)    //選擇排序
{
	int start=0, end=len-1;
	while(start<end)
	{
		int max=start;
		int min=start;
		int j;
		for(j=start; j<=end; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
			if (arr[j] > arr[max])
			{
				max = j;
			}
		}
		int temp=arr[min];
		arr[min]=arr[start];
		arr[start]=temp;
		if (start == max)
		{
			max = min;
		}
		temp=arr[max];
		arr[max]=arr[end];
		arr[end]=temp;
		start++;
		end--;
	}
}
int main()
{
	int arr[10]={9,8,7,6,5,4,3,2,1,0};    //亂序數(shù)組
	int len=sizeof(arr)/4;
	int i;
	for(i=0; i<len; i++)
	{
		printf("%d\t", arr[i]);    //輸出初始數(shù)組,用于比較
	}
	putchar('\n');
	selectsort(arr, len);    //調(diào)用函數(shù)對(duì)數(shù)組進(jìn)行排序,這里選用的是選擇排序的方式
	for(i=0; i<len; i++)
	{
		printf("%d\t", arr[i]);    //輸出排完序后的數(shù)組
	}
	putchar('\n');
	return 0;
 } 

例題及其解答

題目描述

來(lái)源:??途W(wǎng)

小明平時(shí)學(xué)習(xí)太用功了,閑暇時(shí)間就喜歡玩一種數(shù)字游戲,在這個(gè)游戲中,他每次會(huì)使用n個(gè)正整數(shù)先構(gòu)造一個(gè)數(shù)列(x1,……,xn),并可以根據(jù)需要無(wú)限次執(zhí)行以下操作:

選擇兩個(gè)不同的i,j,其中xi>xj,然后將xi改為xi-xj。

請(qǐng)你幫小明算一下,通過(guò)這樣的一系列操作,求出最終處理過(guò)數(shù)列的總和最小值是多少?

輸入描述

第一行一個(gè)整數(shù)n代表數(shù)列的長(zhǎng)度,2<=n<=100,

第二行包含n個(gè)正整數(shù)x1 x2 x3 ... xi, 1<=xi<=100.

輸出描述

經(jīng)過(guò)多次操作后,數(shù)列總和的最小值(整數(shù))。

示例1

輸入

5
45 12 27 30 18

輸出

15

示例2

輸入

3 2 4 6

3
2 4 6

輸出

6

說(shuō)明

在輸出樣例2中進(jìn)行了以下操作:x3 = x3 - x2, x2 = x2 - x1,經(jīng)過(guò)這兩步操作后,所有的數(shù)字都相等,因此操作不能再進(jìn)行下去了,每個(gè)數(shù)都是2,因此6就是總和的最小值。

解答

#include<stdio.h>
void sort(int arr[], int n)    //本題我使用的是冒泡排序,也可使用其他排序方式
{
    int i,j;
    for(i=0; i<n-1; i++)
    {
        for(j=0; j<n-1-i; j++)
        {
            if(arr[j]<arr[j+1])
            {
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);    //輸入數(shù)列長(zhǎng)度
    int arr[n];    //定義相應(yīng)長(zhǎng)度的數(shù)組
    int i;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);    //將輸入的數(shù)據(jù)存入數(shù)組
    }
    while(1)
    {
        sort(arr,n);    //對(duì)數(shù)組進(jìn)行排序
        if(arr[0]==arr[n-1])    //判斷數(shù)組的首末元素是否相等
        {
            break;    //若相等,則無(wú)法再進(jìn)行作差操作
        }
        for(i=0;i<n-1; i++)    //對(duì)數(shù)組中的相鄰且不相等的元素作差
        {
            if(arr[i]>arr[i+1])
            {
                arr[i]=arr[i]-arr[i+1];
            }
        }
    }
    int sum=0;
    for(i=0; i<n; i++)    //對(duì)最終的數(shù)組進(jìn)行求和
    {
        sum=sum+arr[i];
    }
    printf("%d\n", sum);    //輸出答案
    return 0;
}

結(jié)語(yǔ)

以上就是四種數(shù)組排序方式的全部?jī)?nèi)容,以及在例題中的應(yīng)用。

到此這篇關(guān)于C語(yǔ)言中數(shù)組排序淺析的文章就介紹到這了,更多相關(guān)C語(yǔ)言數(shù)組排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車違章處罰管理系統(tǒng)

    基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車違章處罰管理系統(tǒng)

    這篇文章主要介紹了基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車違章處罰管理系統(tǒng)的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • C/C++實(shí)現(xiàn)經(jīng)典象棋游戲的示例代碼

    C/C++實(shí)現(xiàn)經(jīng)典象棋游戲的示例代碼

    中國(guó)象棋是起源于中國(guó)的一種棋,屬于二人對(duì)抗性游戲的一種,在中國(guó)有著悠久的歷史。本文將利用C++實(shí)現(xiàn)這一經(jīng)典游戲,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06
  • 淺談QT打包的兩種方式

    淺談QT打包的兩種方式

    本文主要介紹了淺談QT打包的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • c++11之std::async 和std::thread的區(qū)別小結(jié)

    c++11之std::async 和std::thread的區(qū)別小結(jié)

    std::async和std::thread都是C++11中提供的線程庫(kù),它們都可以用于創(chuàng)建新線程,本文主要介紹了c++11之std::async 和std::thread的區(qū)別小結(jié),感興趣的可以了解一下
    2024-02-02
  • C/C++獲取Windows平臺(tái)CPU占用率的方法

    C/C++獲取Windows平臺(tái)CPU占用率的方法

    最近在做系統(tǒng)信息相關(guān)的接口,為了實(shí)現(xiàn)跨平臺(tái),故在linux和Windows平臺(tái)獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下
    2023-12-12
  • C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Pthread?并發(fā)編程線程自底向上深入解析

    Pthread?并發(fā)編程線程自底向上深入解析

    這篇文章主要為大家介紹了Pthread?并發(fā)編程線程自底向上深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • C++使用函數(shù)的一些高級(jí)操作指南

    C++使用函數(shù)的一些高級(jí)操作指南

    C++中函數(shù)調(diào)用的方法與C語(yǔ)言并無(wú)區(qū)別,依舊是在調(diào)用方函數(shù)中執(zhí)行函數(shù)調(diào)用語(yǔ)句來(lái)實(shí)現(xiàn)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于C++使用函數(shù)的一些高級(jí)操作,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的詳細(xì)流程

    C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的詳細(xì)流程

    所謂級(jí)聯(lián)分類器其實(shí)就是把分類器按照一定的順序聯(lián)合到一起,下面這篇文章主要給大家介紹了關(guān)于C++使用opencv調(diào)用級(jí)聯(lián)分類器來(lái)識(shí)別目標(biāo)物體的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • c語(yǔ)言中return與exit的區(qū)別淺析

    c語(yǔ)言中return與exit的區(qū)別淺析

    c語(yǔ)言中return與exit的區(qū)別淺析,需要的朋友可以參考一下
    2013-03-03

最新評(píng)論