7中排序演算法
阿新 • • 發佈:2018-11-19
氣泡排序:最簡單的一種排序演算法。先從陣列中找到最大值(或最小值)並放到陣列最左端(或最右端),然後在剩下的數字中找到次大值(或次小值),
以此類推,直到陣列有序排列。演算法的時間複雜度為O(n^2)。
for (int i=0;i<10;i++)
{
for (int j=i+1;j<10;j++)
{
if (a[i]>a[j])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for (int i=0;i<10;i++)
{
for (int j=9;j>=i+1;j--)
{
if (a[j-1]>a[j])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
第二種應該是正統的,符合那個邏輯流程的氣泡排序
2、選擇排序
嚴蔚敏版《資料結構》中對選擇排序的基本思想描述為:每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。
具體來說,假設長度為n的陣列arr,要按照從小到大排序,那麼先從n個數字中找到最小值min1,如果最小值min1的位置不在陣列的最左端(也就是min1不等於arr[0]),
則將最小值min1和arr[0]交換,接著在剩下的n-1個數字中找到最小值min2,如果最小值min2不等於arr[1],則交換這兩個數字,依次類推,直到陣列arr有序排列。
演算法的時間複雜度為O(n^2)。
int a[10] = { 5,6,9,8,9,6,3,5,1,3 };
int temp = -1;
int index = 0;
for (int i=0;i<10;i++)
{
index = i;
temp = a[i];//每次進入排序的時候,假設自己為最小的
for (int j=i+1;j<10;j++)
{
if (temp>a[j])
{
index = j;//如果發現自己不是最小的,那麼就記錄這個值,和下標的值
temp = a[j];
}
}
a[index] = a[i];
a[i] = temp;//互相交換值
}
for (int i=0;i<10;i++)
{
cout << a[i] << " ";
}
3.插入排序的基本思想就是將無序序列插入到有序序列中。例如要將陣列arr=[4,2,8,0,5,1]排序,可以將4看做是一個有序序列(圖中用藍色標出),
將[2,8,0,5,1]看做一個無序序列。無序序列中2比4小,於是將2插入到4的左邊,此時有序序列變成了[2,4],無序序列變成了[8,0,5,1]。無序序列中8比4大
,於是將8插入到4的右邊,有序序列變成了[2,4,8],無序序列變成了[0,5,1]。以此類推,最終陣列按照從小到大排序。該演算法的時間複雜度為O(n^2)。
這是我初步寫的,算是半成品的插入排序吧,
for (int i=1;i<10;i++)//新插入的i下標
{
for (int j=0;j<i;j++)//已經拍好序的部分,初始是第一位0假設排好序了
{
if (a[i]<a[j])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");
}
下面這個才是符合插入排序邏輯的插入排序:
int a[10] = { 8,9,6,3,5,7,1,2,4,0};
int temp = -1;
int index = 0;
for (int i=1;i<10;i++)
{
temp = a[i];//要插入的數
for (index =i-1; index >=0; index--)
{
if (temp<a[index])
{
a[index + 1] = a[index];
}
else
{
break;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");
}
a[index + 1] = temp;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");