91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

常用的簡單排序之插入排序,冒泡排序,選擇排序,希爾排序

發布時間:2020-04-09 07:19:02 來源:網絡 閱讀:435 作者:mumu462 欄目:編程語言

1、插入排序

   插入排序的工作原理是建立有序序列,對于未排序數據,在已排序的數據從后先前掃描,找到對應的位置后插入。

   ①從第一個元素開始,該元素被默認為有序序列。

   ②從下一個未排序數據開始,在已經排序的序列中從后往前掃描     

   ③如果該元素小于已排序的元素,繼續往前掃描

   ④重復③,直到找到該元素大于或等于已排序的元素的位置

   ⑤插入該元素

   ⑥重復②

代碼:

void InsertSort(int *a,int size)
{
	assert(a);
	for (int i = 1; i < size; i++)
	{
		int index = i;
		int end = index - 1;         //已排序序列最后一個元素下標
		int temp = a[index];         //保存未排序數據的值
		while (end >= 0 && temp < a[end])
		{
			a[end + 1] = a[end]; //當為排序數據小于已排序序列數據時,把已排序數據向后移一位
			end--;  //繼續往前掃描
		}
		a[end + 1] = temp; //找到未排序數據大于或等于已排序序列,或者整個已排序序列沒有一個數小于未排序數據時
	}
}

  插入排序對幾乎已經排好序的數據進行操作時,效率很高。但插入排序一般來說是低效的,每次只能挪動數據一位。


2、選擇排序

  選擇排序的思想是每一趟從待排序的數據元素中選出最小的一個元素,順序放在已排好序的數列的最前,直到全部待排序的數據元素排完。

 

void SelectSort(int *a,int size)

{

  assert(a);

  for(int i=0;i<size;i++)

  {

    int min=i;

    for(int j=i+1;j<size;j++)

    {

      if(a[min]>a[j])

        min=j;

    }

   swap(a[i],a[min]);

  }

}

還可以優化,我們可以在選出最小的元素放在序列頭的同時,選出最大的元素放在序列尾

void SelectSort(int *a, int size)
{
	assert(a);
	for (int left = 0, right = size - 1;left<=right;left++,right--)
	{
		int max = right, min = left;
		for (int i = left; i <= right; i++)
		{
			if (a[min] > a[i])
				swap(a[min],a[i]);
			if (a[max] < a[i])
				swap(a[max],a[i]);
		}
		swap(a[min], a[left]);
		swap(a[max], a[right]);
	}

3、冒泡排序

 從第一個元素開始,對數組中兩兩相鄰的元素比較,將值較小的元素放在前面,值較大的元素放在后面,一輪比較完畢,一個最大的數沉底成為數組中的最后一個元素,一些較小的數如同氣泡一樣上浮一個位置。

void BubSort(int* a,int size)
{
	for (int i = 0; i < size; i++)
	{
		int symbol = false;
		for (int j = 1; j < size - i ; j++)
		{
			if (a[j] < a[j - 1])
				swap(a[j], a[j - 1]);
				symbol = true; 
		}
		if (symbol == false) //當symbol為false時,就說明后面的已經有序
			break;
	}
}

4、希爾排序

  希爾排序其實是更優化的插入排序。

  其思想為:

    把記錄按步長 gap 分組,對每組記錄采用直接插入排序方法進行排序。隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到 1 時,整個數據合成為一組,構成一組有序記錄,則完成排序。

常用的簡單排序之插入排序,冒泡排序,選擇排序,希爾排序

void ShellSort(int *a, int size)
{
	assert(a);
	int gap = size;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = gap; i < size; i++)//比如當gap=4時,并不是讓它分別進行4組插入排序,而是采用一種比較巧的方法,讓i從gap開始每次加1,這樣就能把4組插入排序,一次走完
		{
			int index = i;
			int temp = a[index];
			int end = index - gap;
			while (end >= 0 && temp<a[end])
			{
				a[end + gap] = a[end];
				end -= gap;
			}
			a[end + gap] = temp;
		}
	}
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台安县| 安平县| 商丘市| 乳源| 元阳县| 漳平市| 阿拉善左旗| 灯塔市| 镇巴县| 朝阳县| 蓬莱市| 丰宁| 潢川县| 永仁县| 宝鸡市| 正定县| 沛县| 平顶山市| 龙江县| 呼伦贝尔市| 黔东| 沙田区| 饶阳县| 喜德县| 英吉沙县| 育儿| 浪卡子县| 晴隆县| 福海县| 安多县| 灌南县| 积石山| 长汀县| 德安县| 九寨沟县| 青浦区| 临湘市| 承德县| 普陀区| 兴安县| 大理市|