C++版本直接插入排序
阿新 • • 發佈:2019-01-28
總體思想:將一個元素插入到已經排好序的有序表中,從而得到一個新的記錄數增加1的有序表。
技巧是:
預設第一個元素是已經排好序的,後面的元素就是插入他的左邊還是右邊的問題,預設升序排列,比他小的插到左邊,比他大的插到右邊(實際上所有元素都在他右邊,如果比他大就不交換即可)。
每一次比較都是將第i個元素和第i-1個元素比較,如果發現後面的元素小則表示需要將後面的元素插入到前面的有序表中,才會進行內層迴圈
內層迴圈從有序表的最後一個元素開始,往前遍歷,直到遇到小於等於哨兵的元素時,停止迴圈,而之前遍歷到的元素都需要進行向後移動,以挪出空位給哨兵(哨兵值就是當前需要插入到新位置的元素的值)。
設定一個哨兵,用來存放需要插入到新位置的元素(就是說這個元素比他前面的元素要小)。
1.外層迴圈從第二個元素開始(因為預設第一個元素已經排好隊了)
2.只有當第i個元素比第i-1個元素小的時候才需要進行內層迴圈,表示將第i個元素插入到他應該位於的位置,需要在內層迴圈移動前面有序表裡的元素,同時需要用到哨兵快取當前元素。
3.外層迴圈遍歷到最後一個元素(第n個元素,因有效資料的下標這裡從1開始)以後,結束排序。
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
template <typename T>
class SqList
{
public:
T r[MAXSIZE+1];
int length;
public:
SqList(T * var,int len);
SqList();
void printList();
Status swapElement(int i, int j);
void InsertSort();
};
template <typename T>
SqList<T>::SqList(T * var,int len)
{
length = len/sizeof(T);
memcpy(&(r[1]), var, len);
}
template <typename T>
SqList<T>::SqList()
{
memset(this, 0, sizeof(SqList));
}
template <typename T>
Status SqList<T>::swapElement(int i,int j)
{
T tmp =this->r[i];
this->r[i] = this->r[j];
this->r[j] = tmp;
return OK;
}
template <typename T>
void SqList<T>::printList()
{
for (int i = 1; i <= length; i++)
{
cout << this->r[i] << "\t";
}
cout << endl;
}
/************************************************************************/
/* 直接插入排序 */
/************************************************************************/
template <typename T>
void SqList<T>::InsertSort()
{
int i = 0, j = 0;
for (i = 2; i <= length; i++)//外層迴圈表示從無序表中依次將其元素插入到有序表中
//預設第一個元素是有序表,所以從第二個元素開始直到第n個元素結束,
//這些元素都是無序表中的元素,需要依次把它們插入到前面的有序表中
//一次外層迴圈表示處理好無序表中的一個元素
{
if (r[i] < r[i - 1])//第i個元素是無序表中的第一個元素
//第i-1個元素是有序表中的最後一個元素,也是有序表中最大的元素
//如果無序表中的第一個元素(當前元素)比有序表中的最大元素小
//表示需要將當前元素往前插,至於插到什麼位置,由內層迴圈決定
{
r[0] = r[i];//利用哨兵將當前元素的值快取下來
for (j = i - 1; r[j] > r[0]; j--)//內層迴圈將比當前元素的值(哨兵的值)大的元素後移挪出空位
{
r[j + 1] = r[j];//移動比哨兵大的元素
}
r[j + 1] = r[0];//將哨兵插入空位,該空位以前的元素要麼為空要麼逗比他小,否則不會結束迴圈
}
}//遍歷到最後一個元素的時候排序完畢
}
int main(void)
{
int myList[9] = {90,10,50,80,30,70,40,60,20};
SqList<int> list(myList,sizeof(myList));
cout << "before sort:"<< endl;
list.printList();
list.InsertSort();
cout << "after sort:" << endl;
list.printList();
cout<<"Hello!"<<endl;
system("pause");
return 0;
}